2010-02-21 57 views

回答

3

​​是一個很好的介紹到Java的泛型。 [A]和[B]解釋區別?和對象。基本上?表示類型未知,如果需要將項目添加到列表中,則這是一個問題。但是,如果只從列表中讀取,則可以將結果視爲Object。雖然,我建議使用一些東西一樣

public interface CacheClient { 
    List<? extends Key> getKeysWithExpiryCheck(); 
} 

[A] http://java.sun.com/docs/books/tutorial/extra/generics/subtype.html

[B] http://java.sun.com/docs/books/tutorial/extra/generics/wildcards.html

+2

Josh Bloch在Effective Java 2nd Edition建議返回列表而不是List <?擴展Key>,因爲你不會失去任何好處,但不會讓用戶使用List <?擴展Key>無處不在。 – Roman 2010-02-21 11:09:29

0

難道是確保類型安全?返回對象列表意味着列表可以容納任何東西。

1

如果你宣佈你的方法

List<Object> getKeysWithExpiryCheck(); 

只能從它返回List<Object>情況下,沒有別的。如果你嘗試返回List<String>,您會收到編譯錯誤。這是因爲雖然ObjectString的超類型,但List<Object>不是超類型List<String>

0

基本上這意味着該集合可以容納任何類型。 但是,當使用它是不可能修改集合。

public void doSomething(Collection<?> col) { 
    for (Object o : col) { 
     System.out.println(o); 
    } 

    col.add("string"); //Compile Error here ! 
} 
+0

你可以刪除元素,並且實際上將它們添加回來。 – 2010-02-21 17:22:40

+0

@Tom,看起來像你是正確的,事實上你可以從集合中刪除元素。 但是,我給出的示例是有效的,並且在嘗試將對象添加到集合時會出現編譯錯誤。 – Tal 2010-02-21 18:46:55

+0

你給出了一個不能編譯的代碼的例子。這並不意味着不存在一個技巧,允許您添加刪除的元素回來。 – 2010-02-21 23:38:16

相關問題