2015-09-26 181 views
-1

我有這個代碼的問題。Java可變參數混淆?

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

} 

當我運行這個代碼輸出將是「-434」。 問題是爲什麼: 這個A[] aa = new A[2];當傳遞到sifter(aa);這個劑量不叫static void sifter(A[]... a2){s+="1";}。它會調用這個方法static void sifter(Object o){s+="4";} 有人可以解釋我這個嗎? 在(A[]... a2)裏面發生了什麼?

回答

1

傳遞給篩選器(aa)時;此劑量不會調用靜態無效篩選器(A []​​ ... a2){s + =「1」;}。

您在varargs中給出了錯誤的語法(看起來很困惑)。

您已定義爲

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

功能,意味着你reciving的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[]

+0

*您在可變參數中給出了錯誤的語法*沒有真正值得注意的是,當您從程序'sifter(aa)中移除方法'sifter(Object o)'時''調用方法'sifter A [] .. aa);' –