gpt4 book ai didi

Java同一个List中的多个子类型和父类(super class)型

转载 作者:行者123 更新时间:2023-12-01 18:44:51 25 4
gpt4 key购买 nike

我有一个父类(super class) Animal和一个子类 Dog 。在第三节课中,我有一个 List它同时接受子类型和父类(super class)型对象。

public class foo{
public ArrayList<Animal> animals;
public ArrayList<Animal> copyOfAnimals;

public foo(ArrayList<Animal> a){
animals=a;
copyOfAnimals = new ArrayList<>(a);
}
}

虽然这工作正常,但我无法调用 foo(dog);这是一个 ArrayList<Dog> 。这会产生错误。

如果我实现通配符,

public class foo{
public ArrayList<? extends Animal> animals;
public ArrayList<Animal> copyOfAnimals;

public foo(ArrayList<? extends Animal> a){
animals=a;
copyOfAnimals = new ArrayList<>(a);
}
}

将导致另一个错误,我无法执行 animals.add(anotherAnimal)这对我来说很重要。

还有其他解决办法吗?正在制作Animal抽象出一个解决方案?

更新

foo是一个机器人Recyclerview适配器类,旨在显示 Animal 的列表和Dog以及任何其他子类型。

最佳答案

问题不清楚,但这是我的一般建议。

  1. 因为您希望存储实现 Animal 的任何类型,你应该使用List<Animal> .

  2. 如果您需要get all elements that have a particular subclass ,您应该从 Animal 列表中生成该列表。它是派生数据。你可以这样做:

var dogs = animals.stream()
.filter(obj -> obj instanceof Dog)
.map(obj -> (Dog) obj)
.collect(Collectors.toList());

并尝试设计Foo :

public class Foo {
private List<Animal> animals;

public List<Dog> getDogs() {
return animals.stream()
.filter(obj -> obj instanceof Dog)
.map(obj -> (Dog) obj)
.collect(Collectors.toList());
}

public Foo(List<Animal> animals) {
this.animals = new ArrayList<>(animals);
}
}

关于Java同一个List中的多个子类型和父类(super class)型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59858171/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com