gpt4 book ai didi

java - 如何将子类的 LinkedList 传递给期望普通类的 LinkedList 的功能?

转载 作者:行者123 更新时间:2023-12-04 07:15:43 26 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





Is List<Dog> a subclass of List<Animal>? Why are Java generics not implicitly polymorphic?

(19 个回答)


14 天前关闭。




我得到了一个需要对象的 LinkedList 的函数,是否可以传递和使用这些对象的子类的 LinkedList?

public abstract class Car {...} //just for example

public class Audi extends Car {...}

public void showCars (LinkedList<Car> cars) { //example function
for (Car i : cars) {
System.out.println(i);
}
}

public void test () {
LinkedList<Audi> audis = new LinkedList<Audi>();

audis.add(new Audi(...)); //just for example so that the list is not empty
showCars(audis); //this says that its expecting a LinkedList<Cars>
//but got LinkedList<Audi>
}
它说 showCars 需要 LinkedList 但得到 LinkedList 。这只是一个非常简单的代码大纲,希望能说明我的问题。

最佳答案

有两种方法可以做到这一点:
更改接受方法签名
您调用的方法应该接受 Cars 或其子类的列表才能使其工作,并且您必须以这种方式定义它。将您的 showCars 方法签名更改为以下内容:

public void showCars (LinkedList<? extends Car> cars)
您可以阅读 https://docs.oracle.com/javase/tutorial/extra/generics/wildcards.html想要查询更多的信息。
更改作为参数传递的列表类型
根据@JohnBollinger 的正确评论,还有另一种方法。您可以将列表声明为汽车列表,并将其发送到您的方法,而不是奥迪列表:
public abstract class Car {...} //just for example

public class Audi extends Car {...}

public void showCars (LinkedList<Car> cars) { //example function
for (Car i : cars) {
System.out.println(i);
}
}

public void test () {
LinkedList<Car> audis = new LinkedList<>();

audis.add(new Audi(...)); //just for example so that the list is not empty
showCars(audis); //this says that its expecting a LinkedList<Cars>
//but got LinkedList<Audi>
}
记住比带有 Class 的列表泛型类型也将接受其子类的对象。这将保留原始方法签名并让调用者负责提供正确类型的 LinkedList .当您调用的方法由您无权访问的库或其他来源提供时,这也是执行此操作的正确方法。

关于java - 如何将子类的 LinkedList 传递给期望普通类的 LinkedList 的功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68778720/

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