来自https://docs.oracle.com/javase/7/docs/api/java/util/Stack.html的文档。
public class Stack<E> extends Vector<E>
这不违反里氏替换原则吗?里氏替换原则简单来说是指,同一父类的对象应该可以相互替换而不会导致任何问题。
例如:假设我有一个函数以Vector作为输入。如果在调用函数时我开始传递一个Stack,则可能会出错,因为Stack不允许随机访问元素。
import java.util.*;
class Book {}
class TextBook extends Book {}
public class Sample {
public static void process(Vector<Book> books) {
# This should not be allowed for Stack, Stack is FILO
System.out.println(books.get(1));
}
public static void main(String[] args) {
Vector<Book> books = new Vector<>();
books.add(new Book());
books.add(new Book());
books.add(new Book());
process(books);
System.out.println("ok");
Stack<Book> bookz = new Stack();
bookz.add(new Book());
bookz.add(new Book());
bookz.add(new Book());
process(bookz);
System.out.println("ok");
}
}
Stack
类支持对数据的随机访问,因此不违反规则。但它可能被优化为仅支持push()和pop()。您将会注意到同样的情况适用于ArrayList
(优化了随机访问)与LinkedList
(优化了快速插入和删除)。 - StefanRectangle
继承的类Square
。这并不违反继承原则,因为数学上来说,Square
是一个Rectangle
。然而,如果Rectangle
有一个setWidth
和setHeight
,并且你在Square
中重写它们,使得它们都设置宽度和高度(以确保它是正方形),那么使用Square
作为Rectangle
的方法将会看到其大小意外地改变。这就是LSP违规。 - RealSkeptic