2012-11-15 51 views
3

在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到供应商处理的适当类型的协变变换。

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

+0

目前还不清楚,如果你的意思是你知道你正在编写它的列表,地图和整数代码,在这种情况下,你可以做一个普通的老演员,或者如果它的三'类'对象你不知道,在这种情况下你是正确的,这是不可能的。 – Affe

+0

请提供更多的语料。谁创建实例'List >'?如果你控制'new'语句,你可以在那里添加额外的信息,以便这种类型的转换是可能的。你控制它吗? – Saintali

+0

查看我的编辑 –

回答

2

你会得到最接近的是这样的:

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

这将产生一个编译器警告,因为不安全的铸造和原材料类型的使用,但它实际上是安全的(如果你知道你的对象包含的内容它说它的确如此)。

+0

但是在这种情况下,“传统”铸造没有优势吗? – Puce

+1

不,你会使用这个版本,如果你没有在编译时的类型 –

+0

@SeanPatrickFloyd thx,我实际上正在做你刚才提到的。不喜欢编译器警告,所以想知道是否有其他的方式来做到这一点,我不知道。 –

2

不是没有得到警告,AFAIK。

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