0

这段代码:

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

但为什么?Ksay中的类型约束K必须是它的子类型Option[Int]None即使我尝试val a: K = Some(0)in Base,也会产生相同的错误。

我对这种行为感到非常困惑,不知道为什么会发生这种情况,也许你可以帮助我?

4

1 回答 1

4

trait Base[K <: Option[Int]]只是说:有一种类型KOption[Int]. 您的第二部分GaranteedA确切说明了为什么您的Base定义不能假装它NoneK-imagine 的子类型,您没有覆盖val a。您最终会将值None强制转换为Some.

仅仅因为K是 的子类型Option[Int]并且None是 的子类型Option[Int],并不能保证那None是 的子类型K

于 2013-04-06T11:59:47.003 回答