如何从List <Object>转换为List <A>或List <?延伸A>?

rev*_*eer 3 java casting list

可能重复:
如何在Java中将对象列表从一种类型转换为另一种类型?

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

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似乎不喜欢它...)

Sub*_*der 8

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)

建议创建类型安全的ListList<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)


Bri*_*new 6

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

List<A> obj = new ArrayList<A>();
Run Code Online (Sandbox Code Playgroud)

开始?

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

编译器错误的真正含义是,您遇到了设计问题.

  • +1这是很好的方法,即使它不是OP正在寻找的. (3认同)
  • Downvoted*为什么*? (2认同)