搜索了一下互联网,发现没有好办法...我现在的解决方案是:
public class A {}
List<Object> obj = new ArrayList<Object>();
obj.add(new A());
// Ugly solution here:
List<A> a = (List<A>) (List) obj;
Run Code Online (Sandbox Code Playgroud)
但这非常难看,并得到警告.没有"官方"的方式这样做?
编辑:关闭这个的人:我知道在Java中如何将一个对象列表从一种类型转换为另一种类型?它与我在我的问题中发布的那个相同(只是<?> 在第一次演员完全相同之后加入)我正在寻找更"干净"的东西.在使用Class<?> clazz = listobj.get(0).getClass获取类的方法和在运行时转换到正确的类的方向(但不知道是否有类似的东西... Eclipse似乎不喜欢它...)
List<Object> obj = new ArrayList<Object>();
obj.add(new A());
Run Code Online (Sandbox Code Playgroud)
这不是编写代码的正确方法.基本上,您正在创建一个通用List并向其添加Object,它键入unsafe并保留任何Object类型.
List<Object> obj = new ArrayList<Object>();
obj.add(new A());
obj.add(new String("str"));
obj.add(1);
Run Code Online (Sandbox Code Playgroud)
建议创建类型安全的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;
}
Run Code Online (Sandbox Code Playgroud)
那么为什么你的名单没有被宣布为
List<A> obj = new ArrayList<A>();
Run Code Online (Sandbox Code Playgroud)
开始?
做你想做的事真的很危险.你所说的是你的列表包含As及其子类.但因为它最初是一个Objects 列表(即任何东西).你以后可能会得到一个令人讨厌的惊喜.
编译器错误的真正含义是,您遇到了设计问题.