Java varargs方法重载编译错误 - 歧义?

时间:2017-03-13 09:59:27

标签: java overloading ambiguity

所以,今天我一直在测试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"); }

2 个答案:

答案 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找到更具体的方法。但是,由于intInteger都不是彼此的子类型,编译器将抛出错误。