我想创建一个具有以下界面的地图类容器:
public <T> Thing<T> get(Class<T> clazz);
public <T> void put(Class<T> clazz, Thing<T> thing);
有趣的是,每个T
中的Class<T>
- &gt; Thing<T>
对是相同的T
,但容器应该能够容纳许多不同类型的对。最初我尝试了一个(哈希)Map。但是,例如,
Map<Class<T>, Thing<T>>
不正确,因为T
与该地图中所有对的T
相同。当然,
Map<Class<?>, Thing<?>>
有效,但后来我没有类型安全保证,因此当我get(String.class)
时,我无法确定是否有Thing<String>
实例。
有没有一种明显的方法来实现我正在寻找的那种类型的安全性?
答案 0 :(得分:5)
地图本身不能保证,但如果您只通过上述方法访问它,您将获得所需的安全性。
答案 1 :(得分:2)
如果你想要能够放置不同的类型,你不应该声明两个类型参数吗?
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,而不是实际测试它。