2014-06-10 115 views
3
public <? extends Animal> void takeThing(ArrayList<?> list) 
    public <T extends Animal> void takeThing(ArrayList<T> list) 

爲什麼這句話錯了?我的意思是爲什麼?不能用在前面?但是T可以。有什麼不同?通配符和'T'有什麼區別?

可能的複製「When to use wildcards in Java Generics?

下面是該question.But我沒有得到什麼這意味着一個答案。 「 」如果你說void的話沒有返回類型,如果你指定了那麼就有返回類型,我不知道你可以指定返回類型或沒有返回類型。

+0

http://stackoverflow.com/a/24113942/1553851 - 閱讀編輯。 – shmosel

回答

4

書寫<T extends Animal>綁定類型名稱T,因此它可以在定義的後面(包括在參數列表中)引用。

如果你寫了<? extends Animal>,那麼你沒有命名這個類型。因此,您以後無法參考。你以後不能將其稱爲?,因爲這可能是不明確的(如果你有兩個類型參數?)。

Java禁止你寫public <?> ...,因爲這樣的聲明沒用(類型參數沒有命名,所以不能使用)。

4
public void takeThing(ArrayList<? extends Animal> list) 

的意思是 「做一些與任何子類的Animal列表」。

public <T extends Animal> void takeThing(ArrayList<T> list) 

的意思是 「做一些事情的Animal列表某些特定子(又名T)」。

如果我打電話list.get()上的第一個方法,我所知道的關於返回類型是它擴展Animal。在第二種方法中,如果我有List<T>的另一個實例,則知道無論類型爲T,這兩個列表都會接受相同的類型。

把它更進一步,如果我說

Animal animal = list.get(0); 

我再也不能說

list.add(animal); 

即使在同樣的名單,因爲我們沒有給通用參考亞型。但是,如果我宣佈一個List<T>,其中<T extends Animal>,我現在可以說

T animal = list.get(0); 
list.add(animal); 

,因爲我們知道,list預計T類型的元素。

相關問題