如何将子 class 的 LinkedList 传递给正常 class 的 LinkedList?
How can I pass a LinkedList of a sub class to function expecting LinkedList of the normal class?
我有一个需要对象 LinkedList 的函数,是否可以传递和使用这些对象的子 class 的 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
泛型类型的列表也将接受其 subclasses.This 的对象将保留原始方法签名并将责任留给调用者以提供正确类型的 LinkedList
.当您调用的方法是由您无权访问的库或其他来源提供时,这也是执行此操作的正确方法。
您可以尝试类似的方法:
public void test () {
LinkedList<? extends Car> audis = new LinkedList<Audi>();
LinkedList pleaseDontDoIt = audis;
pleaseDontDoIt.add(new Audi());
showCars(pleaseDontDoIt);
}
但这完全不安全
我有一个需要对象 LinkedList 的函数,是否可以传递和使用这些对象的子 class 的 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
有两种方法可以做到这一点:
更改接受方式签名
您调用的方法应该接受 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
泛型类型的列表也将接受其 subclasses.This 的对象将保留原始方法签名并将责任留给调用者以提供正确类型的 LinkedList
.当您调用的方法是由您无权访问的库或其他来源提供时,这也是执行此操作的正确方法。
您可以尝试类似的方法:
public void test () {
LinkedList<? extends Car> audis = new LinkedList<Audi>();
LinkedList pleaseDontDoIt = audis;
pleaseDontDoIt.add(new Audi());
showCars(pleaseDontDoIt);
}
但这完全不安全