Scala类型约束混淆错误

时间:2013-04-06 11:53:10

标签: scala traits design-by-contract type-constraints

此代码:

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,产生同样的错误。

我对这种行为感到很困惑,不知道为什么会这样,也许你可以帮助我?

1 个答案:

答案 0 :(得分:4)

trait Base[K <: Option[Int]]只是说:K类型是Option[Int]的子类型。您的第二部分GaranteedA清楚地说明了Base定义无法假装NoneK的子类型的原因 - 假设您覆盖{ {1}}。您最终会将值val a转换为None

仅因为SomeK的子类型且Option[Int]是[{1}}的子类型,并不保证NoneOption[Int]的子类型1}}。