Collections.unmodifiableXXX 方法是否违反了 LSP?[已关闭]
里氏替代原理是SOLID的原理之一。我现在已经多次阅读了这个原则,并试图理解它。
这是我从中得到的,
这个原则与类层次结构之间的强行为契约有关。子类型应该能够在不违反约定的情况下替换为超类型。
我也读过其他一些文章,思考这个问题我有点迷茫。方法是否不违反 LSP?Collections.unmodifiableXXX()
上面链接的文章摘录:
换句话说,当通过其基类接口使用对象时,用户只知道基类的前置条件和后置条件。因此,派生对象不得期望此类用户遵守比基类所需的前提条件更强的前提条件。
我为什么这么认为?
以前
class SomeClass{
public List<Integer> list(){
return new ArrayList<Integer>(); //this is dumb but works
}
}
后
class SomeClass{
public List<Integer> list(){
return Collections.unmodifiableList(new ArrayList<Integer>()); //change in implementation
}
}
我无法改变将来返回不可修改列表的暗示。编译将起作用,但如果客户端以某种方式尝试更改返回的,那么它将在运行时失败。SomeClass
List
这就是Guava为集合创建单独的不可变XXX接口的原因吗?
这不是直接违反了LSP还是我完全搞错了?