java - 方法调用与可变参数运算符不明确

标签 java overloading variadic-functions scjp

下面的代码会产生语法错误:

The method f(int[]) is ambiguous for the type C

我的代码:

public class C{

    public static void f(int... i)
    {
        System.out.println("a");
    }

    public static void f(Integer... i)
    {
        System.out.println("b");
    }

    public static void main(String[] args) {
        f(new Integer(2));
    }
}

如果我使用数组符号 [] 而不是 ... 并使用 f(new Integer[]{3,4, 5}),编译器可以正确判断我要使用哪种方法。

编译器无法决定使用 ... 调用哪个函数的原因是什么?

最佳答案

JLS, Secion 15.12, "Method Invocation Expressions" 中解释了为特定调用站点找到“正确”方法的过程。 .经过简短的基本健全性检查前奏后,相关部分从 section 15.12.2.1, Identify Potentially Applicable Methods 开始。 .根据此定义,在您的情况下,这两种方法都可能适用

后续流程分为三个阶段。在您的情况下,该方法是一个可变元数 方法(由于“varargs”)。所以它立即从 15.12.2.4, Phase 3: Identify Applicable Variable Arity Methods 开始.

The method m is an applicable variable-arity method if and only if all of the following conditions hold:

  • For 1 ≤ i < n, the type of ei, Ai, can be converted by method invocation conversion to Si.
  • ...

(其他条件与此无关)

Method Invocation Conversion (JLS, 5.3)允许进行以下转换:

  • 身份转换(§5.1.1)
  • 扩大原始转换(§5.1.2)
  • 扩大引用转换(§5.1.5)
  • 装箱转换 (§5.1.7) 之后可选择加宽引用转换
  • 拆箱转换(§5.1.8),可选地后跟扩大的原始转换。

IntegerInteger 的转换是身份转换(第一个要点)。从 Integerint 的转换是拆箱转换(最后一个要点)。

因此根据规范,这两种方法都是“适用的可变元数方法”。

关于java - 方法调用与可变参数运算符不明确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25465147/

相关文章:

c++ - 是否需要重写一个以基类为参数的虚函数?

c++ - c++11中已删除函数的返回类型

Java - Wav 文件 - 空字节?

java - 如何为整个项目配置单个属性占位符

java - 在java中使用&和|将字节转换为整数

c++ - 矩阵类 C++ 作为 matlab 运算符重载

java - 有两个不确定参数的方法?

c++ - 是否可以在可变参数函数中处理非原始类型?

c - 如何使用自己的自定义函数(不是 vprintf 等)处理可变参数(通过省略号传递)?

java - 设置 PDF 导出器的输出文件名