【问题标题】:Java 8 Array List Returns a List of Superclass Objects [duplicate]Java 8 数组列表返回超类对象列表 [重复]
【发布时间】:2019-11-24 00:35:16
【问题描述】:

ArrayList 是否可以返回超类对象的列表?

例如:

B 类扩展 A 类。

我有一个 B 类的 ArrayList。

如何使用 Java 8 返回 A 类对象的 ArrayList?

例如:

class ClassA {}
class ClassB extends ClassA{}

我有一个名为 classBList 的 ClassB 列表。我想获取 ClassA 对象的列表。

List <ClassA> classAList = new ArrayList <ClassA> (classBList);

但我仍然在 classAList 中获得 ClassB。

请帮忙。谢谢。

【问题讨论】:

  • 你已经有一个了; B 对象的列表是 A 对象的列表,因为所有 B 对象都是 A 对象。也许您可以编辑问题以更具体地说明您想要实现的目标,最好是使用代码示例。
  • 已编辑。有可能吗?
  • 除非ClassA implements List&lt;ClassA&gt; 然后ClassA 肯定不能分配给List&lt;ClassA&gt;。但这还不足以让我弄清楚你想要做什么;请写一个最小可重复的例子。 stackoverflow.com/help/minimal-reproducible-example
  • 只要您不希望客户端在调用您正在处理的方法后将某些内容添加到列表中,您可以将其声明为public List&lt;? extends ClassA&gt; body(),它允许返回List&lt;ClassB&gt; .
  • 我用代码编辑过。请帮忙。谢谢。

标签: java java-8


【解决方案1】:

如果我正确理解了这个问题,您有一个运行时类型 ClassB 的对象列表,并且想要一个运行时类型 ClassA 的对象列表。

考虑:

ClassB b = new ClassB();
ClassA a = b

这里的ba 指的是同一个实例。 ClassB 的一个实例。

如果我们真的想改变运行时类型,我们需要创建一个新对象。假设一个合适的构造函数:

ClassA b = new ClassB();
ClassA a = new ClassA(a);

要将其应用于列表,我认为:

List<ClassA> as = bs.stream()
    .map(ClassA::new)
    .toCollection(Collectors.toCollection(ArrayList::new));

或者,更易读但不那么令人印象深刻:

List<ClassA> as = new ArrayList<>() {
for (ClassB b : bs) {
    as.add(new ClassA(b);
}

但是,一般一个类应该是叶子(实际上是最终的)或抽象的

【讨论】:

    猜你喜欢
    • 2021-04-06
    • 2016-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多