可能重复:
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>
答案 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>
的部分
干杯,