从Class <t>到Thing <t> </t> </t>的类型安全映射

时间:2010-06-09 06:28:48

标签: java generics mapping type-safety

我想创建一个具有以下界面的地图类容器:

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>实例。

有没有一种明显的方法来实现我正在寻找的那种类型的安全性?

2 个答案:

答案 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,而不是实际测试它。