0

这意味着定义trait Option[T]与 相同trait Option[+T]

很容易认为val humanOpt: Option[Human]can 指向一个Option[Student]实例,就像val humanOpt: Humancan 指向一个Student实例一样。

也许这看起来有些奇怪,但我为什么要考虑这个?

Java 变量默认为多态,与 c++ 相比,它应该使用virtual关键字。我认为在 Java 中简化 OO 很重要。

Scala 在许多与 Java 相比更频繁的用例中使用高阶类型,例如OptionTry或者自己定义 a Cache[T]

此外,它仍然符合 Liskov Substitution 原则。

我只想知道为什么不将协变简化为默认行为?

4

1 回答 1

1

或者自己定义一个Cache[T]

如果你Cache有一个put(T)方法,它不能是协变的,正是因为 Liskov 替换原则。

val humanCache: Cache[Human] = new Cache[Student] // legal if cache is covariant
humanCache.put(new Professor) // oops, we put a Professor into a Cache[Student]

因此,默认情况下使所有类型协变根本行不通。

您可以改用方差推断:如果类型可以是协变的,则使其成为协变的,如果它可以是逆变的,则使其成为逆变的,如果两者都不能使其保持不变。但是,只需添加一个方法就可以改变方差并使用您的类型破坏大量代码。通过明确所有差异,您必须在这样做时注意到。

于 2017-11-24T06:02:39.070 回答