【发布时间】:2017-03-13 09:59:26
【问题描述】:
所以,今天我一直在测试 Java 的重载技术,但遇到了无法解释的歧义。基本上,当有一个原始的可变参数方法及其相应的包装器时,编译器会抱怨并且无法决定选择哪个,我不明白为什么?人类容易决定而不是编译器?
这是适用于非可变参数的片段:
public static void main(String[] args)
{
int a = 14;
Integer b = new Integer(14);
stuff(a);
stuff(b);
}
static void stuff(Integer arg) { System.out.println("Integer"); }
static void stuff(int arg) { System.out.println("int"); }
来了 vararg 像婴儿一样抱怨和哭泣:
public static void main(String[] args)
{
int a = 14;
Integer b = new Integer(14);
stuff(a); // Doesn't compile (ambiguity)
stuff(b); // Doesn't compile (ambiguity)
}
static void stuff(int... arg) { System.out.println("varargs int"); }
static void stuff(Integer... arg) { System.out.println("varargs Integer"); }
【问题讨论】:
-
因为autoboxing,所以实际上这两种方法其实是一样的。
-
由于自动装箱,Java 知道如果将整数传递给函数,它们可以转换为整数。但是,这意味着这两种方法都是候选方法。作为人类,我们更好,并且知道哪个是最有可能的。
-
不,抱歉,我认为这还不够。
stuff(int... arg)里面的arg有int[]的类型,那为什么要把参数转换成Integer呢? -
看这里以获得更深入的解释:stackoverflow.com/questions/36384527/…
标签: java overloading ambiguity