Java varargs混乱?

时间:2015-09-26 04:18:58

标签: java oop

我的代码存在问题。

class A{}
class B extends A{}

public class TestExms {
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.println(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";}

}

当我运行此代码时,put将是" -434"。 问题是为什么:  当A[] aa = new A[2];传递给sifter(aa);时,这个static void sifter(A[]... a2){s+="1";}不会调用static void sifter(Object o){s+="4";}。它将调用此方法(A[]... a2) 有人可以解释一下这个吗? 这个.meteor/cordova-plugins内发生了什么?

1 个答案:

答案 0 :(得分:1)

  

传递给sifter(aa);这个剂量不能称为静态空洞筛子(A []​​ ... a2){s + =“1”;}。

你在varargs中给出了错误的语法(似乎很困惑)。

您将自己定义为

static void sifter(A[]... a2) {
        s += "1";
    }

这意味着您正在收集A[]的非A数组。

当您将签名更改为

时,它会起作用
static void sifter(A... a2) {
        s += "1";
    }

写作时

static void sifter(A[]... a2) {
        s += "1";
    }

相当于

static void sifter(A[] a1, A[] a2, A[] a3) { // and so on 
        s += "1";
    }

因此,当您将A []传递给它时,将While数组视为Object而不是A[]