错误的接口实现是否违反里氏替换原则?

Does the wrong interface implementation violate Liskov Substitution Principle?

让我们考虑以下接口实现:

Comparator<String> stringComparator = (o1, o2) -> 0;

是否违反里氏替换原则?

在这个具体案例中,没有。您的示例 Comparator 只是说所有字符串都相等。这满足 Comparator 的合同(参见 javadoc),更广泛地说,它满足 Liskov 可替代性原则 (LSP)。

(这个Comparator没有用1,很可能是一个错误/错误,但没有违反LSP。)

在更一般的情况下,不满足 Comparator 合同的 Comparator 实现在技术上违反了 LSP。但你也可以说它坏了。您修复它 主要是 因为它坏了/不能正常工作...不是因为某些设计原则。

更一般地说,并非所有违反 LSP 的示例都是损坏的代码。一个例子是 IdentityHashMap,它(故意且有用地)违反了 Map 的约定,在测试键是否相同时不使用 equals()。 (它使用 == 代替。正确地,考虑到 class 的目的。)

违反 LSP 会导致意外行为,但并非所有意外都是错误。


1 - 我想不出使用这个比较器的情况。不是 TreeMap。不排序...

这个比较器实现了一个完全有效的总顺序。

只需检查公理:

  • 对于所有 ab:如果 a <= bb <= a 那么 a = b 是微不足道的(前提无关紧要,结果总是正确的)
  • 传递性是微不足道的,因为 a <= b 对于所有 ab
  • 总数是微不足道的:对于所有 ab,它同时包含 a <= bb <= a

因此,即使它与 Liskov 替换原则有任何关系,它仍然只是 Comparator.

的一个完全有效的实现