2012-10-15 97 views
0
class Aliphatic<F> extends Organic<F>{} 
class Hexane<G> extends Aliphatic<G>{} 
public class Organic<E>{ 
    void react(E e){} 
    static void main(String[] args){ 
     Organic<? extends Organic> compound = new Aliphatic<Organic>(); 
     compound.react(new Organic()); 
    } 
} 

爲什麼我不能用有機參數調用react方法? 參考<? extends Organic>的泛型類型說實例化的泛型類型可以是有機的,也可以是有機的子類型。運行時已知的通用上界通配符實例化

是因爲編譯器不知道這個實例泛型類型,直到運行時鍵入一個所以它沒有綁定任何值到它的泛型標準?

這種情況爲什麼會起作用?這種情況是否一樣?

public class WildcardCollection { 
    public static void main (String[] args){ 
     WildcardCollection w = new WildcardCollection(); 
     w.myMethod(new Items("hola",1));  //Compile 
     w.myMethod(new SubItems("nuevo",3)); //Compile 
    } 
    public <T extends Items> void myMethod(T a){ //Same as above 
     System.out.println("hi: "+a); 
    } 
} 
class SubItems extends Items { 
    SubItems(){}; 
    SubItems(String s, int i){ super(s,i);} 
} 
class Items implements Comparable<Items> { 
    private String name; 
    private int value; 

    public Items() {} 

    public Items(String n, int i){ this.name = n; this.value = i;} 
    public String getName(){ return this.name;} 
    public int getValue(){ return this.value;} 

    public String toString(){ return "(" + this.name + "-" + this.value + ")";} 

    public int compareTo(Items i){ 
     return this.value - i.getValue(); 
    } 
} 
+1

相關:http://stackoverflow.com/questions/1292109/generics-get-and-put-rule –

+0

而另一個插件對於HTTP:// WWW。 angelikalanger.com/Generi csFAQ/JavaGenericsFAQ.html - 我從來沒有發現有關泛型的問題,無法通過引用該網站來回答。 –

回答

2

很簡單,如果你有一個? extends X通配符實例化,那麼你不能調用採取T類型的參數對象的方法類型參數T一些通用類型的對象,因爲編譯器不保證類型安全。然而你可以調用方法返回T(並將返回值分配給類型爲X的變量)。在您的具體的例子看起來這應該是安全的

Organic<? extends Organic> compound = new Aliphatic<Organic>(); 
compound.react(new Organic()); 

但請記住,編譯器必須匹配基礎上,聲明型(? extends Organic)的react調用,它不能靠你已經什麼分配給RHS。如果編譯器允許這個那麼它也必須允許

Organic<? extends Organic> compound = new Aliphatic<Hexane<?>>(); 
compound.react(new Organic()); 

這顯然是不正確的 - 這是完全一樣的情況

Collection<? extends Number> nums = new ArrayList<Float>(); 
nums.add(Integer.valueOf(1)); 

(這一切都拋開的事實,因爲Organic是一般你需要說Organic<? extends Organic<?>>或類似的,而不是僅僅Organic<? extends Organic>

+0

因此,允許聲明參考有機<?如果您不能添加任何內容,則延伸有機>無效。 ¿? – Joe

+0

如果你想能夠「添加」任何東西(即傳入變量類型的參數),那麼編譯器需要能夠確定類型是兼容的,所以你需要一個具體的類型。 '有機化合物=新脂肪();'會沒事的。 –

+0

爲什麼這種情況在WildcardCollection中起作用?這種情況是否一樣? – Joe