协方差投射与泛型

时间:2012-11-15 17:13:19

标签: java generics casting

在Java中,如果我有以下信息:List.class, Map.class, Integer.class和某个Object的实例foo。是否可以将foo投射到List<Map<Integer, Integer>>?我想不是因为类型擦除,而是想知道是否有其他方法可以实现类似的东西。

编辑:提供更多背景信息。我正在编写一个能够进行查询(由对象和度量组成)并输出所需度量的应用程序。一个例子是“列表中元素的总和”。客户端需要编写一个向应用程序注册自己的提供程序,并广播它能够为某些对象类型提供某种度量标准类型(例如,列表的总和)。应用程序收到查询后将匹配正确的提供程序并在其上调用calculate方法。

没有泛型,这很简单。对象的任何实例的规范类型都是它的类。因此,我会将查询中的对象视为Object,然后使用其class,找到能够为此对象实例提供的提供程序。指标类似。

现在介绍泛型...假设我将度量标准f定义为列表中元素的总和(如果元素为Integer则为产品,如果元素为Double。我需要2个提供者,一个提供List<Integer>,另一个提供List<Double>。但由于类型擦除,我无法直接使用规范类型class。所以我存储了相关的类(List.classInteger.classList.classDouble.class)并使用类的元组匹配提供程序。

因此在calculate方法中,我需要执行从Object到提供者处理的适当类型的协变强制转换。

也许我对这个问题采取了错误的方法?

2 个答案:

答案 0 :(得分:2)

你最接近的是:

List<Map<Integer, Integer>> fooList = List.class.cast(foo);

由于不安全的转换和原始类型的使用,它会产生编译器警告,但它实际上是安全的(如果你知道你的Object包含它所说的那样)。

答案 1 :(得分:2)

并非没有得到警告,AFAIK。

List<Map<Integer, Integer>> bar = (List<Map<Integer, Integer>>) foo;