在 Scala “4.5 Variance”中的函数式编程原理的这段视频中,您可以看到一张幻灯片,上面写着:
翻译:
假设您有两种函数类型:
type A = IntSet => NonEmpty type B = NonEmtpy => IntSet
根据里氏替换原则,下列哪项应该是正确的?
A <: B
(选中)B <: A
A
并且B
是无关的。
视频声明类型A
是 type 的子类型B
;但是,它确实是这么说的,
类型 A 满足与类型 B 相同的合同,如果你给它一个 NonEmpty 集,它会给你一个 IntSet,但它实际上会满足比 B 更多。
但这不是真的,B 包含 NonEmpty 集,其中包含的不仅仅是IntSet。这个视频是不是直接不正确和混乱?