Java 7的超载可变参数[复制](Java 7 overloading with varargs

2019-07-19 07:24发布

可能重复:
错误可变参数和超载?

任何人都可以解释我这个是如何工作的:

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);
    }
}

还可以获得编译时错误。 当我们使用可变参数重载机制是什么? 它是超载可变参数方法的错误吗?

Answer 1:

实质上,以确定哪些方法适用, 编译器运行几个步骤 :

  • 首先试图找到一种方法,而无需使用装箱/拆箱或可变参数
  • 第二试图找到一种方法,让装箱/拆箱,但没有可变参数
  • 第三,允许装箱,拆箱和可变参数

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

然后,编译器确定哪些方法适用,并且如果一个比另一个更具体的。 具体规则是在JLS 15.12.2.4 。 总之,它着眼于类型,并检查是否一个比另一个更具体的(即,一个类型是其他的用于引用一个子类或一种类型比另一种对原语是窄)。

你的情况:

  • 实施例1中,这两种方法均适用,但int是更具体的比long所以vararg(int...)被选择
  • 实施例2中, Integer与无特异性关系long (一个是参考另一个是primitve),所以两者都是最大特定且有导致编译错误的歧义。

编辑

我还以为你说,你的第一个例子中编译,但不是第二个(这是预期的行为)。 你似乎在说,没有编译,在这种情况下,它可能是由于你的版本错误javac ,这已得到修复与Java 7的细节参见发行说明 ,部分称为最具体的可变参数方法的选择“更改”。



Answer 2:

正如你在可变参数(类型... VAR)方法发送int值和重载方法包含一个整数和一个长的话,int值就会自动铸造长,因此创建歧义。 在重载方法使用不同的参数的类型。

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

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

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

}



文章来源: Java 7 overloading with varargs [duplicate]