模式匹配抽象类型特征成员

时间:2015-07-13 23:18:37

标签: scala pattern-matching traits type-erasure abstract-type

sealed trait Foo {
   type T <: Option[Any]
   val x : T
}

case class Bar(x : Option[Int]) extends Foo { 
   type T = Option[Int]
}

val baz : Foo = Bar(Some(42))

baz.x match {
   case Some(a) => a
   case None => 1337
}

这是尝试模式匹配时的错误消息:

:12: error: pattern type is incompatible with expected type;
found   : None.type
required: baz.T

我认为这是由于T型的类型擦除所致。

1 个答案:

答案 0 :(得分:0)

我不确定为什么会失败,可能是类型推断的限制。以下作品:

__block

无论如何,要求(baz.x: Option[Any]) match { case Some(a) => a case None => 1337 } 的子类型没有意义。更好地定义选项的元素类型:

Option