【问题标题】:Converting ArrayList of Objects to an ArrayList of Parent Objects将对象的 ArrayList 转换为父对象的 ArrayList
【发布时间】:2020-10-29 09:59:18
【问题描述】:

我有不允许修改的文件 Card.java 和 Util.java。出于我自己的目的,我创建了一个扩展 Card 的类 Card2,并添加了一个 equals() 方法和一个 hashcode() 方法。 Util 类包含一个将ArrayList<Card> 作为参数的方法。我有一个ArrayList<Card2>,我想运行那个方法。

我的理解是,在这种情况下,Card2Card 具有“is-a”关系,所以我认为应该有一种方法可以将 ArrayList<Card2> 转换为 ArrayList<Card>

我不确定如何进行这种转换。我尝试了(ArrayList<Card>) arr,其中arrArrayList<Card2>,但我收到一条错误消息,指出这些是不可转换的类型。我意识到我可以创建一个新的ArrayList<Card> 并独立添加arr 中的每张卡片,但我想知道是否有更好的方法来解决这个问题。

【问题讨论】:

  • 我认为你应该做的是,从一开始就声明一个 ArrayList<Card>,但在创建它们时用 Card2 对象填充它。

标签: java oop arraylist


【解决方案1】:

给定一张 Card2 的列表:

ArrayList<Card2> card2s;

这样做:

ArrayList<Card> cards = new ArrayList<>(card2s);

构造函数接受Collection&lt;? extends Card&gt;,在英文中它是一个集合,任何东西都是Card或扩展Card

【讨论】:

    【解决方案2】:

    如果您有权访问该 util 方法,则可以按照所述在输入参数中使用通配符...

    https://docs.oracle.com/javase/tutorial/extra/generics/wildcards.html

    “这里有一个很小但非常重要的区别:我们用 List extends Shape> 替换了 List 类型。现在 drawAll() 将接受 Shape 的任何子类的列表,所以我们现在可以在 List 上调用它如果我们愿意”

    如果您无权访问该方法,您仍然可以在列表中投射项目。 Java 流 api 示例:

    Is it possible to cast a Stream in Java 8?

    【讨论】:

      【解决方案3】:
          ArrayList<Card2> card2s = new ArrayList<>();
      
          ArrayList<Card> cards = (ArrayList<Card>)card2s.stream().map(card2 -> {
              Card card = new Card();
              //your logic to take data from card2 variable and set it to the new Card2 object:
              //e.g. card.setType(card2.getType());
              return card;
          }).collect(Collectors.toList());
      

      【讨论】:

      • 我不确定这如何将 ArrayList arr 转换为 ArrayList
      • 它创建一个卡片流,然后将Card 类型的每个对象映射到Card2 类型的新对象。您必须在注释区域的每个对象中设置数据或您希望的任何内容,然后它返回映射对象。最后将其收集到集合中。
      • 是的,我在您进行编辑之前发表了评论。我目前正在我的代码中对其进行测试。
      • 请问?在谁进行编辑之前? :) 这只是如何将一个列表转换为另一个列表的概念。 cards2 只是一个示例数据。
      • 该死,我很抱歉 :') 出于某种原因,我以为其他人评论过你的答案。
      猜你喜欢
      • 2013-10-16
      • 1970-01-01
      • 2014-04-28
      • 2011-02-14
      • 2012-10-21
      • 2016-01-24
      • 2011-06-14
      • 1970-01-01
      • 2014-11-10
      相关资源
      最近更新 更多