Java 可变参数方法重载编译器错误 - 歧义?

标签 java overloading ambiguity

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

最佳答案

考虑以下对 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?

这两个可变参数方法是在松散的调用上下文中调用的。因此,编译器将尝试通过 JLS 15.12.2.5 Choosing the Most Specific Method 找到更具体的方法。 .但是,由于 intInteger 都不是彼此的子类型,因此编译器会抛出错误。

关于Java 可变参数方法重载编译器错误 - 歧义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42760809/

相关文章:

java - 字符串中 'x' 个字符的数量 - 递归

java - 二进制内容响应 - 文件名无效?

java - 使用 GridlayoutManager 如何让 3 个 imageView 填充设备宽度?

c++ - 预期的行为是什么?

c++ - 上下文敏感性与歧义

java - hibernate SessionFactory 不起作用

c++ - 运算符的多重重载

fortran - 不同等级的重载fortran接口(interface)

c++ - 重载虚函数并通过指向基类的指针调用派生函数

C++ 对模板结构声明歧义!