java - 集合子类型 - Liskov 替换原则

标签 java collections liskov-substitution-principle subtyping

Java 不允许Collection<Car>作为 Collection<Vehicle> 的子类型.这是因为 Collection<Car>不能代替每个 Collection<Vehicle>作为 Collection<Vehicle>可能包含其他 Vehicle 子类型的元素,例如 Motorbike,因此它违反了 Liskov 替换原则?

最佳答案

一般来说,Collection由于“可选操作”的存在,s 违反了 Liskov 替换原则,即变异方法可能无法用于特定实现。

然而,关于类型安全,它是这样工作的:

假设CarVehicle 的子类型, 一个 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/

相关文章:

java - Java 中枚举最常见的用法是什么?

java - 在java中扩充工厂模式

c# - 重写方法是违反 LSP 的唯一方法吗

c# - S.O.L.I.D Essentials 缺少点?

c# - Liskov 替换原则、前提条件和抽象方法

java - java中的未经检查和运行时异常

java - 从 Swing GUI 编译和运行 Java 代码

java - Google 集合框架中最常用的类是什么?

java - 如何在 anyMatch() java 8 流中应用复合 BiPredicate

java - 将 LinkedList<short[]> 传递给构造函数,它会起作用吗?