2012-11-14 25 views
4

我想要實現這樣的地圖,的TypeMap Java中

Map<Class<T>, T> m;

中,我能給出的T級

的我知道你可能類型T的通用對象,比如說,你可以換一個Map<String, Object>並使用轉換來存檔。

我知道這一點。

但想象一下地圖是Map<Class<T>, Collection<T>>,其中的值是一個非常大的集合。

我不想遍歷集合並投射每個對象,因爲集合太大。

所以呢?我該怎麼辦?

+0

你的意思是「包裝一個地圖<類,對象>」? –

回答

1

我不想遍歷集合並投射每個對象,因爲集合太大。

我不會擔心,因爲

  • 你不應該需要做的
  • 泛型是編譯時檢查,以便澆鑄到一個通用的在運行時沒有做任何事情。

例如如果T extends Object,鑄造ObjectT不會做任何事情。類似地,在運行時拋出CollectionCollection<T>不會執行任何操作。

但想象中的地圖是地圖<類< T>,收藏< T >>,其中,該值是一個非常大的集合。

如果你想這會做什麼,鑄造是不是答案。您可能需要轉換Collection的內容,但在Java中完全不同。

4

Guava有類似的東西,它叫做ClassToInstanceMap

您可以閱讀更多關於它in a dedicated Wiki section

但顯然你需要的是一個ClassToInstanceMultimap。目前還沒有,但您可以提交功能請求。

+0

感謝您給我們!我不知道。但我想我會給@Peter Lawrey最好的答案。他的回答確實解決了這個問題。 –

+0

@ShivaWu我同意 –

0

注意,如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年後,我在很大程度上清除階段再次消除他們從我的代碼。他們是一個黑客,並沒有給我儘可能多的好處,我希望他們給。