使用泛型自動投射

使用泛型,可以返回撥用者期望的任何內容:

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);

使用這種方法,你不能將錯誤的型別放入地圖中,因此結果將始終正確(除非你不小心建立了兩個具有相同名稱但不同型別的鍵)。

有關: