我得到了一个函数,它期望对象的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
泛型类型的列表将接受其子类的also对象。这将保留原始的方法签名,并将提供正确类型的LinkedList
的责任留给调用方。当您调用的方法是由您无法访问的库或其他源提供时,这也是正确的方法。
你可以试试这样做:
public void test () {
LinkedList<? extends Car> audis = new LinkedList<Audi>();
LinkedList pleaseDontDoIt = audis;
pleaseDontDoIt.add(new Audi());
showCars(pleaseDontDoIt);
}
但这是完全不安全的