【问题标题】:How to cast from List<Object> to List<A> or List<? extends A>? [duplicate]如何从 List<Object> 转换为 List<A> 或 List<?扩展 A>? [复制]
【发布时间】:2012-12-22 03:06:43
【问题描述】:

可能重复:
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? 中发布的解决方案与我在问题中发布的解决方案相同(只需在第一次演员表后添加&lt;?&gt; 完全相同) 我在寻找更“干净”的东西。在使用Class&lt;?&gt; clazz = listobj.get(0).getClass 获取类并在运行时强制转换为正确类的方向上(但不知道这样的东西是否有效……Eclipse 似乎并不喜欢它……)

【问题讨论】:

  • 你为什么要创建List&lt;Object&gt;
  • @AdamArold 谢谢你的回答。是的,我应该更具体一点:List&lt;Object&gt; 来自于我正在使用 JDBC 获取数据库并且我不一定知道会出现的数据类型这一事实。显然我不是为了好玩而创建List&lt;Object&gt; ^^

标签: java list casting


【解决方案1】:

那么为什么你的列表没有声明为

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

开始?

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

编译器错误的真正含义是您在某个地方遇到了设计问题。

【讨论】:

  • +1 这是一个很好的方法,即使它不是 OP 想要的。
  • @BrianAgnew 谢谢你的回答。是的,也许我当时有一个设计缺陷,但是当我将 apache 的 commons-dbutils-1.5.jar 用于 JDBC 时,我将其设计为可以从数据库中获取任何数据类型。因此List&lt;Object&gt;。但是为了以后使用,我需要将它们转换为它们的 java 类型......那么我在这里使用 JDBC 完全错误吗? (我没有这方面的经验,刚开始编码:))
【解决方案2】:

也许问题是您想将不同(但与继承相关)类型的对象放入列表中?在这种情况下,您阅读Generics Tutorial,尤其是关于&lt;? extends Something&gt;&lt;? super Something&gt; 的部分

干杯,

【讨论】:

    【解决方案3】:
    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&lt;A&gt; obj = new ArrayList&lt;A&gt;();

    你可以这样做 -

    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&lt;Object&gt; 来自这样一个事实,即我正在使用 JDBC 获取数据库并且我不一定知道会出现的数据类型。显然我不是为了好玩而创建List&lt;Object&gt; ^^
    • 感谢您的回答。是的,这似乎是一个朝着我喜欢的方向发展的解决方案。我会检查一下。由于这是我得到的最佳答案,我将对其进行验证。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2011-12-03
    • 2019-10-23
    • 1970-01-01
    • 2019-07-21
    • 2015-03-13
    • 1970-01-01
    • 1970-01-01
    • 2020-11-27
    相关资源
    最近更新 更多