gpt4 book ai didi

java - 在 Java 中扩展适当参数的参数

转载 作者:搜寻专家 更新时间:2023-10-31 20:01:06 25 4
gpt4 key购买 nike

假设我有一个类 Animal和类 Bear扩展类 Animal .现在在构造函数中我有参数 Animal :

public class Forest {

private List<Animal> animals;

public Forest(List<Animal> list) {
animals = list;
}
}

为什么我不能做那样的事情?

List<Bear> bears = new ArrayList<>();
new Forest(bears);

我认为 Bear详细案例Animal .我只能通过将模板添加到 Forest<P extends Animal> 来解决这个问题吗? ?

最佳答案

你可以使用通配符

  private List<? extends Animal> animals;

public Forest(List<? extends Animal> list) {
animals = list;
}

这让列表包含任何种类的动物,甚至是不同类型的混合。

这将全部编译:

       List<Bear> bears = new ArrayList<>();
new Forest(bears);

...

List<Animal> mix = new ArrayList<>();
mix.add(new Animal());
mix.add(new Bear());

new Forest(mix);

缺点是除了它们是动物之外,您不会知道它们的类型。

对于是否以及何时可以使用通配符以及何时使用 extendssuper 有一些规则,具体取决于您是否从集合中放置新元素。

参见 Explanation of the get-put principle有时称为 PECS,代表“Put Extends, Create Super”

编辑

为了以后能够将其他动物添加到列表中,您必须将动物列表字段更改为不使用通配符。但是,构造函数仍然可以使用通配符,但您可能应该创建一个从构造函数传入列表的新 List 对象。

这会起作用:

private List<Animal> animals;

public Forest(Collection<? extends Animal> list) {
animals = new ArrayList<>(list);
}


public void add(Animal a){
animals.add(a);
}

public void addAll(Collection<? extends Animal> as){
animals.addAll(as);
}

后来

 List<Bear> bears = new ArrayList<>();
Forest forest = new Forest(bears);

forest.add(new Animal());

我还添加了一个 addAll 方法,它也使用通配符

 //same mix and bears lists from before
Forest forest2 = new Forest(mix);
forest2.addAll(bears);

关于java - 在 Java 中扩展适当参数的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33284705/

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