月度归档:2014年01月

学了 Scala 后,对里氏代换原则(LSP)的新理解

之前在学习 Java Pattern 时,知道有这个原则,即,所有用父类做为参数的地方,都可以用子类来替换。
Java 中最常见的做法就是声明一个父类或接口的参数,可以传子类的实例或实现接口的实例。

但在 Scala 中,返回值也是函数声明的一部分,那么,LSP 的应用就不仅在参数上了,还有返回值。
Scala 中,如果说 f2 是 f1 的子类,那么 f2 的参数是 f1 的父类,f2 的返回值是 f1 的子类。这样,所有使用 f1 的地方,都可以用 f2 来代替。

再加上 Scala 的协变和逆变,就比较容易声明出合适的方法,让 Scala 进行类型匹配。