如果我只声明2个varargs方法如下:
public void foo(String... strings) {
System.out.println("Foo with Strings");
}
和
public void foo(int... ints) {
System.out.println("Foo with ints");
}
然后有代码:
foo();
由于预期的模糊性,这是编译器错误。
但是,如果我只有以下两个版本的foo:
public void foo(Object... objects) {
System.out.println("Foo with Objects");
}
和
public void foo(int... ints) {
System.out.println("Foo with ints");
}
然后是代码
foo();
调用方法的int版本。任何人都可以解释为什么第二个例子不是同样含糊不清,为什么它解析为Object方法的int方法。感谢。
答案 0 :(得分:29)
如果我从准备scjp时正确回忆起来,在第一种情况下,你有两个参数,它们之间没有关系,所以编译器不能选择一个。
在第二种情况下,启用装箱(1.5+),int可以是Integer,它是Object的子集,如果发生冲突,编译器将始终使用最具体的定义。因此,Integer(int)具有优先级。
答案 1 :(得分:4)
Java将始终使用最接近的类型,因此当您将ints传递给方法时,如果您没有int ...方法,它会将它们自动装入Integers并使用Object ....因为有一个int ...方法,Java将首先使用它。这是Java编译器设计中的一个选择。