将一个集合类型转换为另一个集合类型并在Java中迭代它

时间:2015-04-13 16:34:28

标签: java casting

我有一个包装层,它返回一个特定类型的对象集合。现在我在我的应用程序中调用这个包装器,它具有不同的类型,因此我尝试将已返回的整个集合转换为我的应用程序类型。

Collection<wrapperType> wrapperCollection = wrapper.method();
MyApp<appType> appCollection = (Collection<appType>)wrapperCollection;

上面将wrapperCollection转换为appCollection。现在,当我尝试这样做时: -

for( appType item : appCollection) // Exception-: can't convert wrapperType to appType.
{
.......
}

我想弄明白 - :

  • 如何将wrapperCollection转换为appCollection,以便appCollection中的每个项目成为appType,然后我可以迭代它?有没有其他更好的方法可以让我轻松地对集合进行迭代。
  • 我也在考虑在所有表现方面投出一个好主意。

我研究了以下链接 - :

Cast a Collection to another

4 个答案:

答案 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;它(几乎)是做这种事情的完美工具。