Java 7 使用可变参数重载

标签 java overloading variadic-functions

<分区>

Possible Duplicate:
bug with varargs and overloading?

谁能给我解释一下这个是如何工作的:

class Vararg {
    static void vararg(int... x) {
        System.out.println("Integer..."); 
    }

    static void vararg(long... x) { 
        System.out.println("long..."); 
    }

    public static void main(String [] args) {
        int s = 0;
        vararg(s,s);
    }
}

获取编译时错误

class Vararg {
    static void vararg(Integer... x) {
        System.out.println("Integer..."); 
    }

    static void vararg(long... x) {
        System.out.println("long..."); 
    }

    public static void main(String [] args) {
        int s = 0;
        vararg(s,s);
    }
}

也得到编译时错误。当我们使用可变参数重载时的机制是什么?这是重载可变参数方法的错误吗?

最佳答案

实质上,要确定适用哪种方法,the compiler runs a few steps :

  • 首先尝试找到一种不使用装箱/拆箱或可变参数的方法
  • 第二次尝试找到一种方法,允许装箱/拆箱,但没有可变参数
  • 第三个允许装箱、拆箱和可变参数

在您的情况下,第三步适用于所有方法。

然后,编译器会确定哪些方法适用,以及一种方法是否比另一种方法更具体。详细规则在JLS 15.12.2.4 .简而言之,它查看类型并检查一个类型是否比另一种更具体(即,对于引用,一种类型是另一种类型的子类,或者对于基元,一种类型比另一种类型更窄)。

在你的情况下:

  • 在示例 1 中,两种方法都适用,但 intlong 更具体,因此选择了 vararg(int...)
  • 在示例 2 中,Integerlong 没有特异性关系(一个是引用,另一个是原始值),所以两者都是最大限度地具体,并且存在导致编译错误的歧义。

编辑

我以为你是说你的第一个例子编译但不是第二个(这是预期的行为)。您似乎是说两者都无法编译,在这种情况下,这可能是由于您的 javac 版本中存在错误,Java 7 已修复该错误。请参阅 release notes 中的详细信息。 ,名为“大多数特定 Varargs 方法选择的变化”部分。

关于Java 7 使用可变参数重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14708681/

相关文章:

java - 在 JFreeChart 中更改温度计中的 Mercurial 颜色

java - 在 Java 中创建 GUID

c++ - C++中可变参数函数的问题

c++ - 使用可变参数列表与 vector 的原因 (c++)

c - 带有 int 指针的可变参数列表,未按预期工作

java - Craftercms : How to define a singleton service bean (written in groovy) in Spring?

java - 下载一个数据库文件到app目录

c# - 重载空歧义

c# - 数据类型重载不同时的 .NET 代码重构

c++ - 主发生器溢出? C++