我有一个与以下代码段相关的问题:
class VarArgsTricky {
static void wide_vararg(long... x) {
System.out.println("long...");
}
static void wide_vararg(Integer... x) {
System.out.println("Integer...");
}
public static void main(String[] args) {
int i = 5;
wide_vararg(i, i, i); // needs to widen and use var-args
Long l = 9000000000l;
wide_vararg(l, l); // prints sucessfully "long..."
}
}
对wide_vararg的第一次调用无法编译(说该方法是不明确的),而第二次编译就好了。
有关此行为的任何解释? 谢谢!
答案 0 :(得分:10)
第一个wide_vararg
调用是不明确的,因为编译器可以 :
int
扩展为long
,并调用第一个wide_vararg
方法,或 int
自动装箱到Integer
,然后拨打第二个wide_vararg
。然而,它不知道应该做什么,所以它拒绝编译模糊的方法调用。如果您希望第一次调用编译,请将i
声明为Integer
或long
,而不是int
。
答案 1 :(得分:1)
当调用var-arg方法时,参数在编译时转换为该类型的数组。
在第一次调用中,参数将转换为int []。由于Java中的所有数组都是Object类的直接子类型,因此原始扩展的概念不适用于这种情况,因为long []和Integer []处于同一级别,所以重载都同样适用。因此含糊不清