簡體   English   中英

從Class <T>到Thing <T>的類型安全映射

[英]Type-safe mapping from Class<T> to Thing<T>

我想制作一個具有以下界面的地圖類容器:

public <T> Thing<T> get(Class<T> clazz);
public <T> void put(Class<T> clazz, Thing<T> thing);

有趣的是,每個Class<T> - > Thing<T>對中的T s是相同的T ,但容器應該能夠容納許多不同類型的對。 最初我嘗試了一個(哈希) 地圖 但是,例如,

Map<Class<T>, Thing<T>>

是不對的,因為那么T也是一樣T在該地圖中的所有對。 當然,

Map<Class<?>, Thing<?>>

工作,但后來我沒有類型安全保證,所以當我get(String.class) ,我不能確定我得到一個Thing<String>實例。

有沒有一種明顯的方法可以實現我正在尋找的那種類型的安全性?

地圖本身不能保證,但如果您只通過上述方法訪問它,您將獲得所需的安全性。

如果你想能夠放置不同的類型,你不應該聲明兩個類型參數嗎?

public <K, V> Thing<V> get(Class<K> clazz);
public <K, V> void put(Class<K> clazz, Thing<V> thing);

還是我誤解了這個問題?

編輯:我明白了,如果你想要一個可以容納不同類型實體的容器,你就無法擁有完整的類型安全性,因為當你宣布你的容器時你只能在容器上放一種類型然后你就可以了放入物品,但你不能確定你得到了什么。 最好你最終將對象作為Object放入,然后在你取回它時進行instanceof和強制轉換。 所有收藏都有這個問題。 想象一下,你有一個Collection<T extends Thing> 你可以把它放在Things,ChildOfThings或GrandChildOfThings中,但當你把它拿回來時,你只能保證這是一件事,你無法判斷它是Child還是GrandChild,而不是實際測試它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM