繁体   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