gpt4 book ai didi

java - java.util 中的堆栈类违反了 Liskov 替换原则?

转载 作者:行者123 更新时间:2023-12-03 18:28:40 25 4
gpt4 key购买 nike

来自 https://docs.oracle.com/javase/7/docs/api/java/util/Stack.html 的文档

public class Stack<E> extends Vector<E>

这不是违反里氏替换原则吗? LSP 简单地说就是同一个父类(super class)的对象应该能够在不破坏任何东西的情况下相互交换。

例如:假设我有一个将 vector 作为输入的函数。如果在调用一个函数时我开始向它传递一个堆栈,那么它可能会中断,因为堆栈阻止了元素的随机访问。

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");
}
}

最佳答案

JDK 的 Stack 实现是严格加性的:它只向 Vector 的 实现添加了一些方法,而没有去掉任何东西。因此,始终可以将 Stack 分配(替换)为 Vector 类型的变量,而不限制客户端代码可以执行的操作。因此,它不违反里氏替换原则。

然而,它的设计被认为是有缺陷的,但是根据不同的原则:继承仅适用于子类确实是父类(super class)的子类型的情况。。来自 Effective Java:

There are a number of obvious violations of this principle in the Java platform libraries. For example, a stack is not a vector, so Stack should not extend Vector.

关于java - java.util 中的堆栈类违反了 Liskov 替换原则?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60249962/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com