我有一个包装层,它返回一个特定类型的对象集合。现在我在我的应用程序中调用这个包装器,它具有不同的类型,因此我尝试将已返回的整个集合转换为我的应用程序类型。
Collection<wrapperType> wrapperCollection = wrapper.method();
MyApp<appType> appCollection = (Collection<appType>)wrapperCollection;
上面将wrapperCollection转换为appCollection。现在,当我尝试这样做时: -
for( appType item : appCollection) // Exception-: can't convert wrapperType to appType.
{
.......
}
我想弄明白 - :
我研究了以下链接 - :
答案 0 :(得分:0)
您无法将Collection<WrapperType>
转换为Collection<appType>
,反之亦然。讨论here是不可能的一个原因。如果要实现目标,则需要手动执行此操作,即迭代Collection<WrapperType>
,将每个条目转换为appType
类型的对象,并将它们添加到新的Collection<appType>
< / p>
编辑:看看@ Jean-FrançoisSavard的解决方法。这也称为PECS
答案 1 :(得分:0)
您希望使用泛型集合,或者定义类扩展/实现的父类(主要是接口或抽象类)。然后将对象存储为此父类的列表。
请注意,如果您选择使用泛型,则两种类型都必须兼容。示例:
List<? extends Integer> intList = new ArrayList<Integer>();
for(Number i : intList)
答案 2 :(得分:0)
我相信您可以将代码重构为以下内容。
package com.test;
import java.util.ArrayList;
import java.util.List;
public class GenericWrap {
public static void main(String[] args) {
List<? super String> myList = new ArrayList<String>();
myList.add("hello");
myList.add("world");
for(String s : (List<String>)myList){
System.out.println(s);
}
}
}
答案 3 :(得分:0)
如果您想在不使用任何框架/库的情况下执行此操作,则必须“手动”执行此操作(阅读:手动)。如果您可以获得已为此目的而构建的“某物”的帮助,请尝试Dozer;它(几乎)是做这种事情的完美工具。