2012-03-23 83 views
1

仿製藥具有超強

public class Organic<E> { 
    void react(E e) { 
    } 

    static void main(String[] args) { 
     Organic<? super Elem2> compound = new Organic<Elem>(); 
     compound.react(new Elem()); 
    } 
} 

class Elem {} 

class Elem2 extends Elem {} 

爲什麼有編譯錯誤

的方法反應(捕獲#1-的?超級elem2時)在類型有機不適用於參數( Elem)

回答

0

編譯器不能查看組合的實際值,而只能查看它的聲明。而?本身可能是Elem2。它應該不會讓你撥打Organic<Elem2>.react(Elem)

0

List中的有界通配符可以捕獲Elem2及其任何超類型。由於elem2時擴展ELEM,這意味着只有類型目前捕捉兌換的名單是:

List<Elem2> 
List<Elem> 
List<Object> 
0

這應該工作

Organic<Elem> compound = new Organic<Elem>(); 

這是行不通的,因爲他們是通配符(分配工作,呼籲反應不會)

Organic<?> compound = new Organic<Elem>(); 
    Organic<? extends Elem> compound = new Organic<Elem>(); 
    Organic<? super Elem2> compound = new Organic<Elem>(); 

你也可以做

<F> void react(F e) { 
} 

然後,你可以與野生卡

我不知道爲什麼要與野生卡

2

通過使用超工作,你所定義的下界你的類型參數的工作。你在說你的有機物體的實際類型是Elem2類型或它的一個超類型。因此,編譯器取代了你的反應方法elem2時,這樣

void react(Elem2 value) {} 

所以它的簽名,你不能傳遞一個新的ELEM()到你的對象,因爲這需要向下轉換。

也就是說,你不能這樣做,因爲你不能將Number傳遞給需要Integer的方法。如果應用向下轉換問題已解決。

public static void main(String[] args) { 
    Organic<Object> all = new Organic<Object>(); 
    Organic<? super Elem2> other = all; 

    Elem a = new Elem2(); 
    other.react((Elem2)a); 
} 

或者,你可以delcare它作爲

Organic<? super Elem> other = ...; 

原本應該正常工作。