我对此代码感到非常困惑:
class A {}
class B extends A {}
public class ComingThru {
static String s = "-";
static void sifter(A[]... a2) {
s+="1";
}
static void sifter(B[]... b1) {
s+="2";
}
static void sifter(Object o) {
s+="4";
}
public static void main(String[] args) {
A[] aa = new A[2];
B[] ba = new B[2];
sifter(aa,ba);
System.out.println(s);
}
}
它给出的输出为-1
,但由于找不到匹配的函数,因此应该出现编译错误。
不,这不会产生编译错误。因为B也是A,所以有一个完美的方法签名与调用匹配。这就是所谓的继承。如果您再次检查代码,
class A {}
class B extends A {}
上面的代码使其可以编译和执行。
static void sifter(A[]... a2) {
s+="1";
}
可以通过传递A型或其子类型(即A的子类即B)的数组的可变长度来调用上述方法
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句