有考试的程序.任何人都可以解释"-434"是如何回答的:
class A {}
class B extends A {}
public class ComingThru {
static String s = "-";
public static void main (String[] args) {
A[] aa = new A[2];
B[] ba = new B[2];
sifter(aa);
sifter(ba);
sifter(7);
System.out.print(s);
}
static void sifter(A[]... a2) { s += "1";}
static void sifter(B[]... b1) { s += "2";}
static void sifter(B[] b1) { s += "3";}
static void sifter(Object o) { s += "4";}
}
Run Code Online (Sandbox Code Playgroud)
谢谢!
您可能知道,在调用出现了多个不同参数集的方法时,Java会尝试调用最具体的参数.因此,例如,该sifter(Object)方法可以应用于任何对象,但如果已知该对象是a B[],sifter(B[])则将调用更具体的方法.
棘手的一点是,为了确保向后兼容性,当Java试图找出要调用的方法时,它首先查看是否存在任何适用的非varargs方法.只有没有这样的方法才会考虑varargs选项.
http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#15.12.2
因此,当使用a调用sifter()时A[],非varargs方法sifter(Object)是适用的,因此编译器甚至从不考虑sifter(A[]...).