Java重载:数字,数字; INT,双

use*_*010 13 java overloading

在两天内我在java考试,我无法弄清楚这个问题的答案:

class ClassA {
 public String foo(Integer x , int y) {
  return "Integer, int";
 }
 public String foo(int x, Double y) {
  return "int, Double";
 }
 public String foo(Number x, Number y) {
  return "Number, Number";
 }
 public String foo(Object x, Object y) {
  return "Object, Object";
 }
 public static void main(String... args) {
  ClassA a = new ClassA();
  System.out.print(a.foo(5, 1.2f) + " ");
  System.out.println(a.foo(null, null));
 }
}
Run Code Online (Sandbox Code Playgroud)

什么输出?

答案是:

Number, Number Number, Number
Run Code Online (Sandbox Code Playgroud)

我知道java总是选择最指定的方法,这就是为什么a.foo(null,null);要调用Number,Number方法而不是Object,Object方法.但是为什么a.foo(5,1.2f);还要调用Number,NumberMethod而不是int,Double方法?

但还有一件事可能会有所帮助:如果我删除了f后面1.2,那么调用是: a.foo(5,1.2); 我得到一个编译错误,它无法在Number,Numberint,Double方法之间做出选择...

如果你们能向我解释一下,那会非常有帮助:)

tsk*_*zzy 17

1.2f没有被包裹Double,它被包裹着Float.由于Float它不是Double(它们是不同的子类Number)的子类,因此可以使用的最具体的方法签名是foo(Number,Number).

一旦删除了f,double默认情况下1.2将被处理(原语,而不是包装类),可以自动装箱到a Double.然而,5也可以自动装箱到a Integer,从而引起歧义.