如何将子 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);
}

但这完全不安全