Scala 中的空引用如何合理化?
How is the null reference in Scala justified?
里氏代换原则:
B 是 A 的子类型当且仅当任何人能用 A 做的事都能用 B 做。
那么为什么 Null 是 Scala 中所有 classes 的子类型,即使根据上面的定义它不是任何 class 的子类型?难道不能将 Null 定义为实现所有可能的方法,每个方法都返回 null 吗? Null 在 Scala 中被这样定义的原因是什么?
Null 在 JVM 上几乎是不可避免的。引用可以为空。 Scala 无法阻止它。
Scala 所做的只是将 Java 的 null 包含到统一类型系统中。它存在于 Java 互操作,仅此而已。 Null 在 Java 中是错误的,在 Scala 中也是错误的。
是的,空引用是最终的 LSP 违规行为。不,没有办法解决这个问题。将 null 上的方法调用评估为 null
而不是抛出 NullPointerException
不会或多或少是正确的,同样荒谬。
这里真的没什么好看的。在 Option(...)
中包装任何可为 null 的内容,忘掉这个不正确的黑坑,继续前进。
Couldn't Null have been defined as implementing all possible methods, each returning null?
没有。 1. 方法returning 原始类型不能return null; 2. Scala 拥有 null
的唯一原因是因为 JVM 拥有它;而 JVM null
不会以这种方式运行。这基本上需要在 every 方法调用之前添加一个 if
除非编译器可以 证明 接收者不为空,这通常是不能。
里氏代换原则: B 是 A 的子类型当且仅当任何人能用 A 做的事都能用 B 做。 那么为什么 Null 是 Scala 中所有 classes 的子类型,即使根据上面的定义它不是任何 class 的子类型?难道不能将 Null 定义为实现所有可能的方法,每个方法都返回 null 吗? Null 在 Scala 中被这样定义的原因是什么?
Null 在 JVM 上几乎是不可避免的。引用可以为空。 Scala 无法阻止它。
Scala 所做的只是将 Java 的 null 包含到统一类型系统中。它存在于 Java 互操作,仅此而已。 Null 在 Java 中是错误的,在 Scala 中也是错误的。
是的,空引用是最终的 LSP 违规行为。不,没有办法解决这个问题。将 null 上的方法调用评估为 null
而不是抛出 NullPointerException
不会或多或少是正确的,同样荒谬。
这里真的没什么好看的。在 Option(...)
中包装任何可为 null 的内容,忘掉这个不正确的黑坑,继续前进。
Couldn't Null have been defined as implementing all possible methods, each returning null?
没有。 1. 方法returning 原始类型不能return null; 2. Scala 拥有 null
的唯一原因是因为 JVM 拥有它;而 JVM null
不会以这种方式运行。这基本上需要在 every 方法调用之前添加一个 if
除非编译器可以 证明 接收者不为空,这通常是不能。