将子对象的列表分配给父类类型的列表[重复]

问题描述 投票:0回答:1

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

我试图将子对象列表分配给类型为父类的列表。参见下面的代码。

class Vehicle {

    public int getCylinders() {
        return 0;
    }

}

class V4 extends Vehicle {

    public int getCylinders() {
        return 4;
    }

}


class Test {

    public static void main(String[] args) {
        Vehicle vehicle = new Vehicle();
        Vehicle dodgeV4 = new V4();
        vehicle = dodgeV4;                // no compiler error, parent class type can be assigned a child object

        List<V4> dodgeV4s = new ArrayList<V4>();
        List<Vehicle> vechicles = dodgeV4s;       // A: compiler error
        List<Vehicle> vechicles = dodgeV4s.stream().map(v4 -> v4).collect(Collectors.toList()); // B: no compiler error

    }
}

关于A,我进行了一些搜索,发现可能是由于“协方差和相反方差”。我很好奇的是B,为什么行得通,那里有隐式转换吗?如果我要执行此任务,这是一种合理的方法吗?

谢谢!

java inheritance covariance
1个回答
-1
投票

让我们举一个具体的例子,看看为什么你不能这样做:

List<V4> v4List = new ArrayList<>();
List<Vehicle> vehicleList = v4List;

vehicleList.add(new V3());

V3是Vehicle的另一个子类。让我们看看我们做了什么:我们创建了V4的列表,因此只能将V4和V4的子类添加到列表中。然后,我们创建一个变量链接到该列表,但声明为一个列表。因此,我们可以在其中添加任何车辆了吗?好了,您可以看到这里有一个问题:我们在列表中添加了不是V4子类的车辆。因此,您不能这样做。您使用地图方法的示例之所以有效,是因为车辆列表是...车辆列表与上一个列表不同,而是一个新列表

© www.soinside.com 2019 - 2024. All rights reserved.