我有一个与以下代码段相关的问题:
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..."
}
}
Run Code Online (Sandbox Code Playgroud)
第一次调用wide_vararg无法编译(说该方法是不明确的),而第二次编译就好了.
关于这种行为的任何解释?谢谢!
Mat*_*all 10
第一个wide_vararg电话是模糊的,因为编译器可以任:
ints扩展为longs,并调用第wide_vararg一种方法,或ints自动装入Integers,然后拨打第二个wide_vararg.但是,它不知道它应该做什么,所以它拒绝编译模糊的方法调用.如果你想要第一次编译调用,则声明i为a Integer或a long,而不是an int.
小智 1
当调用 var-arg 方法时,参数会在编译时转换为该类型的数组。
在第一次调用中,参数被转换为 int[]。由于 Java 中的所有数组都是 Object 类的直接子类型,因此基元加宽的概念不适用,在这种情况下,两个重载同样适用,因为 long[] 和 Integer[] 处于同一级别。因此存在歧义
| 归档时间: |
|
| 查看次数: |
225 次 |
| 最近记录: |