所以,今天我一直在测试Java的重载技术,并且我遇到了歧义,我无法解释。基本上,当有一个带原语的vararg方法及其相应的包装时,编译器会抱怨并且无法决定选择哪一个,我不明白为什么?人类决定而不是编译器很容易吗?
这是适用于非vararg参数的片段:
indicator
这里出现了像婴儿一样抱怨和哭泣的vararg:
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"); }
答案 0 :(得分:2)
问题是:
java正在做幕后桥接方法(你需要验证你需要深层信息)
而重要的部分,vargargs也意味着你不能通过任何参数,所以:
static void stuff(int... arg)
和
static void stuff(Integer... arg)
都可以不带参数调用...所以这会产生一些关于JVM应该调用什么方法的冲突
答案 1 :(得分:2)
考虑以下两个对stuff()
的假设调用:
int a = 14;
Integer b = new Integer(14);
stuff(a, b);
stuff(b, a);
编译器如何知道应该在这里调用哪个方法?由于自动装箱规则,任何一个调用都可能指的是重载方法。
<强>更新强>
我的答案在逻辑上是正确的,或至少在正确的轨道上,但对于更正式的答案,我们可以参考这个SO问题:
Why ambiguous error when using varargs overloading with primitive type and wrapper class?
在松散的调用上下文中调用两个varargs方法。因此,编译器将尝试通过JLS 15.12.2.5 Choosing the Most Specific Method找到更具体的方法。但是,由于int
和Integer
都不是彼此的子类型,编译器将抛出错误。