如何从List <object>转换为List <a> or List<!--? extends A-->?</a> </object>

时间:2013-01-08 09:37:22

标签: java list casting

  

可能重复:
  How do you cast a List of objects from one type to another in Java?

搜索了一下互联网,发现没有好办法......我现在的解决方案是:

public class A {}
List<Object> obj = new ArrayList<Object>();
obj.add(new A());
// Ugly solution here:
List<A> a = (List<A>) (List) obj;

但这非常难看,并得到警告。这种做法没有“官方”的方式吗?

编辑:对于关闭此问题的人:我知道How do you cast a List of objects from one type to another in Java?中发布的解决方案与我在问题中发布的解决方案相同(仅在第一次投射后添加<?>完全一样)我正在寻找更“干净”的东西。在使用Class<?> clazz = listobj.get(0).getClass方式获取类并在运行时转换为正确的类的方向(但不知道是否有类似的东西...... Eclipse似乎不喜欢它...)< / p>

3 个答案:

答案 0 :(得分:8)

List<Object> obj = new ArrayList<Object>();
obj.add(new A());

这不是编写代码的正确方法。基本上,您正在创建一个通用List并向其添加Object,它键入unsafe并保留任何Object类型。

List<Object> obj = new ArrayList<Object>();
obj.add(new A());
obj.add(new String("str"));
obj.add(1);

建议您创建类型安全List,例如List<A> obj = new ArrayList<A>();

你可以这样做 -

public <T>List<T> castCollection(List srcList, Class<T> clas){
    List<T> list =new ArrayList<T>();
    for (Object obj : srcList) {
    if(obj!=null && clas.isAssignableFrom(obj.getClass()))
        list.add(clas.cast(obj));
    }
    return list;
}

答案 1 :(得分:6)

那么为什么你的名单没有被宣布为

List<A> obj = new ArrayList<A>();

开头?

做你想做的事真的很危险。您所说的是您的列表包含A及其子类。但因为它最初是Object s(即任何东西)的列表。你以后可能会得到一个令人讨厌的惊喜。

编译器错误的真正含义是你遇到了设计问题。

答案 2 :(得分:2)

也许问题是您想要将不同(但与继承相关)类型的对象放入列表中?在这种情况下,您需要阅读Generics Tutorial,特别是关于<? extends Something><? super Something>的部分

干杯,