此代码:
trait Base[+K <: Option[Int]] {
val a: K = None
}
class GuaranteedA extends Base[Some[Int]] {
override val a = Some(1)
}
产生错误:
<console>:8: error: type mismatch;
found : None.type
required: K
val a: K = None
但为什么呢?
K
中的类型约束表示K
必须是Option[Int]
的子类型None
,即使我在val a: K = Some(0)
中尝试Base
,产生同样的错误。
我对这种行为感到很困惑,不知道为什么会这样,也许你可以帮助我?
答案 0 :(得分:4)
trait Base[K <: Option[Int]]
只是说:K
类型是Option[Int]
的子类型。您的第二部分GaranteedA
清楚地说明了Base
定义无法假装None
是K
的子类型的原因 - 假设您不覆盖{ {1}}。您最终会将值val a
转换为None
。
仅因为Some
是K
的子类型且Option[Int]
是[{1}}的子类型,并不保证None
是Option[Int]
的子类型1}}。