【问题标题】:How to cast an Object type into a List<Object> type?如何将 Object 类型转换为 List<Object> 类型?
【发布时间】:2018-11-12 11:02:19
【问题描述】:
List<Object> frames = new ArrayList();
List<String> names = new ArrayList();

frames.add(names);

//compiler error
frames.get(0).add("ABCD");

由于.get() 返回一个对象类型,而一个对象类型没有.add() 方法,编译器会引发错误。如何将对象类型转换为 List 类型?

【问题讨论】:

  • 你为什么首先尝试这样做?如果这是XY problem,请给我们更多背景信息。强制转换是一种代码味道。
  • 在你的实际情况中,frames 的元素都是List&lt;String&gt;,还是包含多种类型,你只知道第一个是List&lt;String&gt;
  • @Bohemian,元素类型不同。
  • @JohnKugelman,我正在做我的任务,代码解析器会生成给定程序的所有可能路径。

标签: java list generics arraylist collections


【解决方案1】:

你有两个选择:

  • frames 更改为List&lt;List&lt;String&gt;&gt;,以防列表frames 始终包含字符串列表。它是安全的,但仅限于一种类型。

    List<List<String>> frames = new ArrayList<List<String>>();
    
  • 在获取时使用类型转换。这个不安全,我建议您尽可能避免投射。这里会检查从frames List 获得的项目是否真的是一个 List 本身:

    Object first = frames.get(0);
    if (first instanceof List) {
        ((List<String>) first).add("ABCD");
    }
    

此外,尽量避免使用原始类型。在这种情况下,请在声明中使用菱形 &lt;&gt; 运算符:

List<Object> frames = new ArrayList<>();
List<String> names = new ArrayList<>();

【讨论】:

    【解决方案2】:

    您可以将frames 变量的泛型从Object 更改为List&lt;String&gt;。这样编译器可以看到列表中的类型,这允许您使用get(...) 方法。

    List<List<String>> frames = new ArrayList<List<String>>();
    List<String> names = new ArrayList<String>();
    
    frames.add(names);
    
    frames.get(0).add("ABCD");
    

    【讨论】:

      猜你喜欢
      • 2022-11-02
      • 1970-01-01
      • 1970-01-01
      • 2019-06-22
      • 1970-01-01
      • 2021-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多