在两天内我在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,Number
Method而不是int,Double
方法?
但还有一件事可能会有所帮助:如果我删除了f
后面1.2
,那么调用是:
a.foo(5,1.2);
我得到一个编译错误,它无法在Number,Number
和int,Double
方法之间做出选择...
如果你们能向我解释一下,那会非常有帮助:)
tsk*_*zzy 17
1.2f
没有被包裹Double
,它被包裹着Float
.由于Float
它不是Double
(它们是不同的子类Number
)的子类,因此可以使用的最具体的方法签名是foo(Number,Number)
.
一旦删除了f
,double
默认情况下1.2将被处理(原语,而不是包装类),可以自动装箱到a Double
.然而,5也可以自动装箱到a Integer
,从而引起歧义.
归档时间: |
|
查看次数: |
3223 次 |
最近记录: |