public interface CacheClient
{
List<?> getKeysWithExpiryCheck();
}
或者我應該返回
List<Object>
public interface CacheClient
{
List<?> getKeysWithExpiryCheck();
}
或者我應該返回
List<Object>
是一個很好的介紹到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
難道是確保類型安全?返回對象列表意味着列表可以容納任何東西。
如果你宣佈你的方法
List<Object> getKeysWithExpiryCheck();
只能從它返回List<Object>
情況下,沒有別的。如果你嘗試返回List<String>
,您會收到編譯錯誤。這是因爲雖然Object
是String
的超類型,但List<Object>
不是超類型List<String>
。
基本上這意味着該集合可以容納任何類型。 但是,當使用它是不可能修改集合。
public void doSomething(Collection<?> col) {
for (Object o : col) {
System.out.println(o);
}
col.add("string"); //Compile Error here !
}
你可以刪除元素,並且實際上將它們添加回來。 – 2010-02-21 17:22:40
@Tom,看起來像你是正確的,事實上你可以從集合中刪除元素。 但是,我給出的示例是有效的,並且在嘗試將對象添加到集合時會出現編譯錯誤。 – Tal 2010-02-21 18:46:55
你給出了一個不能編譯的代碼的例子。這並不意味着不存在一個技巧,允許您添加刪除的元素回來。 – 2010-02-21 23:38:16
Josh Bloch在Effective Java 2nd Edition建議返回列表而不是List <?擴展Key>,因爲你不會失去任何好處,但不會讓用戶使用List <?擴展Key>無處不在。 –
Roman
2010-02-21 11:09:29