Java 不允许Collection<Car>
作为 Collection<Vehicle>
的子类型.这是因为 Collection<Car>
不能代替每个 Collection<Vehicle>
作为 Collection<Vehicle>
可能包含其他 Vehicle 子类型的元素,例如 Motorbike,因此它违反了 Liskov 替换原则?
最佳答案
一般来说,Collection
由于“可选操作”的存在,s 违反了 Liskov 替换原则,即变异方法可能无法用于特定实现。
然而,关于类型安全,它是这样工作的:
假设Car
是 Vehicle
的子类型, 一个 Collection<Car>
是一种允许像
Collection<Car> c=…;
Car car=c.iterator().next();
哪个Collection<Vehicle>
没有。另一方面,Collection<Vehicle>
是一种允许像
Collection<Vehicle> c=…;
Vehicle v=…;
c.add(v);
哪个Collection<Car>
没有。因此,这些 Collection
都不是类型是另一个的子类型。
关于java - 集合子类型 - Liskov 替换原则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29794996/