使用泛型自動投射
使用泛型,可以返回撥用者期望的任何內容:
private Map<String, Object> data;
public <T> T get(String key) {
return (T) data.get(key);
}
該方法將編譯併發出警告。程式碼實際上比它看起來更安全,因為 Java 執行時將在你使用時執行轉換:
Bar bar = foo.get("bar");
使用泛型型別時安全性較低:
List<Bar> bars = foo.get("bars");
在這裡,當返回的型別是任何型別的 List
時,型別轉換都會工作(即返回 List<String>
不會觸發 ClassCastException
;當從列表中取出元素時,你最終會得到它)。
要解決此問題,你可以建立使用鍵入鍵的 API:
public final static Key<List<Bar>> BARS = new Key<>("BARS");
以及這個 put()
方法:
public <T> T put(Key<T> key, T value);
使用這種方法,你不能將錯誤的型別放入地圖中,因此結果將始終正確(除非你不小心建立了兩個具有相同名稱但不同型別的鍵)。
有關: