我想要實現這樣的地圖,的TypeMap Java中
Map<Class<T>, T> m;
中,我能給出的T級
的我知道你可能類型T的通用對象,比如說,你可以換一個Map<String, Object>
並使用轉換來存檔。
我知道這一點。
但想象一下地圖是Map<Class<T>, Collection<T>>
,其中的值是一個非常大的集合。
我不想遍歷集合並投射每個對象,因爲集合太大。
所以呢?我該怎麼辦?
我想要實現這樣的地圖,的TypeMap Java中
Map<Class<T>, T> m;
中,我能給出的T級
的我知道你可能類型T的通用對象,比如說,你可以換一個Map<String, Object>
並使用轉換來存檔。
我知道這一點。
但想象一下地圖是Map<Class<T>, Collection<T>>
,其中的值是一個非常大的集合。
我不想遍歷集合並投射每個對象,因爲集合太大。
所以呢?我該怎麼辦?
我不想遍歷集合並投射每個對象,因爲集合太大。
我不會擔心,因爲
例如如果T extends Object
,鑄造Object
到T
不會做任何事情。類似地,在運行時拋出Collection
到Collection<T>
不會執行任何操作。
但想象中的地圖是地圖<類< T>,收藏< T >>,其中,該值是一個非常大的集合。
如果你想這會做什麼,鑄造是不是答案。您可能需要轉換Collection的內容,但在Java中完全不同。
Guava有類似的東西,它叫做ClassToInstanceMap。
您可以閱讀更多關於它in a dedicated Wiki section。
但顯然你需要的是一個ClassToInstanceMultimap
。目前還沒有,但您可以提交功能請求。
感謝您給我們!我不知道。但我想我會給@Peter Lawrey最好的答案。他的回答確實解決了這個問題。 –
@ShivaWu我同意 –
注意,如Java使用類型擦除,實現實際上將有你可以寫平凡,讓你想要的類型安全安全訪問方法的
Map<?, ?> = Map<Object, Object>
類型,以及如做一個instanceOf
檢查:
public class InstanceMap extends HashMap<Class<?>, Object> {
public <T> T getInstance(Class<T> cls) {
Object o = super.get(cls);
if (o != null && cls.isInstance(o)) {
return (T) o;
} else {
return null;
}
}
public <T> void putInstance(Class<T> cls, T value) {
super.put(cls, value);
}
@Deprecated
public Object get(Object key) {
return super.get(key);
}
}
這將工作正常,除非你開始使用它們自己是通用的類型。 Class<? super T>
會幫助一下。但總體而言,它主要是給你的類型安全的錯覺。這種地圖並不能給你強大的類型安全,你已經習慣了。最後,它只不過是演員。
我以前用過這樣的地圖,但最終他們用1 - 2年後,我在很大程度上清除階段再次消除他們從我的代碼。他們是一個黑客,並沒有給我儘可能多的好處,我希望他們給。
你的意思是「包裝一個地圖<類,對象>」? –