如何将List<Object>转换为List<A>或List<? extends A>?

3

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

在网上搜索了一下,没有找到很好的方法... 我现在的解决方案是:

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

但这样做很丑陋,而且会有警告。没有“官方”的方法吗?

编辑:对于关闭此问题的人:我知道如何在Java中将一个对象列表转换为另一种类型的列表?中发布的解决方案。它与我在问题中发布的解决方案相同(只需在第一个强制转换后添加<?>就可以完全相同)。我正在寻找更“干净”的方法。使用Class<?> clazz = listobj.get(0).getClass获取类并在运行时将其强制转换为正确的类(但不知道是否有效... Eclipse似乎也不喜欢它...)


3
你为什么要在第一步创建一个List<Object>呢? - Adam Arold
@AdamArold 谢谢你的回答。是的,我应该更具体一些:List<Object> 是因为我使用JDBC从数据库中获取数据,并且我不一定知道将要输出的数据类型。显然,我不是为了好玩而创建 List<Object> ^^ - reverse_engineer
3个回答

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

这不是正确的代码编写方式。基本上,您正在创建一个通用List并向其中添加Object,它是类型不安全的,并保留任何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;
}

谢谢您的回答。是的,我应该更具体一些:List<Object> 是因为我使用JDBC从数据库中获取数据,并且我不一定知道将要输出的数据类型。显然,我不是为了好玩而创建 List<Object> ^^ - reverse_engineer
谢谢你的回答。是的,这似乎是一个我喜欢的解决方案的方向。我会去检查一下。既然这是我得到的最佳答案,我会验证它。谢谢! - reverse_engineer

6
所以,为什么你的列表没有被声明为:
List<A> obj = new ArrayList<A>();

首先?

你正在尝试做的事情非常危险。你所说的是你的列表包含A及其子类。但由于它最初是一个Object的列表(即任何东西),你以后可能会遇到一个不愉快的惊喜。

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


3
这是一种好的做法,即使这不是原帖作者所寻求的。+1 - Peter Lawrey
@BrianAgnew 谢谢您的回答。也许我有设计缺陷,但是当我使用apache的commons-dbutils-1.5.jar进行JDBC时,我设计它可以从数据库中获取任何数据类型。因此是List<Object>。但是为了以后的使用,我需要将它们转换为它们的Java类型...那么我在这里完全错误地使用了JDBC吗?(我没有经验,刚开始编码 :)) - reverse_engineer

2
也许问题在于您想将不同(但继承相关)类型的对象放入列表中?如果是这种情况,建议您阅读泛型教程,特别是关于<? extends Something><? super Something>部分。
祝好,

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接