如何将子类的LinkedList传递给期望正常类的LinkedList的函数?



我得到了一个函数,它期望对象的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);
}

但这是完全不安全的

相关内容

  • 没有找到相关文章

最新更新