我试图将一个子对象列表分配给一个类型为父类的列表。请参阅下面的代码。
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,为什么会这样,那里是否有一个隐含的演员阵容?如果我想完成这项任务,这是一种合理的方法吗?
谢谢!
让我们举一个具体的例子来看看为什么不能做到这一点:
List<V4> v4List = new ArrayList<>();
List<Vehicle> vehicleList = v4List;
vehicleList.add(new V3());
V3是车辆的另一个子类。让我们看看我们做了什么:我们创建了一个V4的列表,因此只有V4和V4的子类可以添加到列表中。然后,我们创建一个链接到此列表的变量,但声明为list。所以我们可以在其中添加任何车辆,对吗?好吧,你可以看到有一个问题:我们在列表中添加了一个不是V4子类的车辆。所以你不能那样做。您使用地图方法的示例之所以有效,是因为车辆列表是……一个与前一个列表不同的车辆列表,它是一个新列表。