意外的特质行为

时间:2015-11-28 17:46:47

标签: scala traits

给出Parent的简单代数数据类型:

scala> sealed trait Parent
defined trait Parent

scala> case object Boy extends Parent
defined object Boy

scala> case object Girl extends Parent
defined object Girl

我定义了一个特征:

scala> trait HasGirl { 
     |   val x: Girl.type
     | }
defined trait HasGirl

然后,我创建了一个实现HasGirl的案例类,但提供了x Boy.type的值。

scala> case class Thing(x: Boy.type) extends HasGirl
defined class Thing

我原本预计会出现编译错误,因为我不知道xBoy.type如何符合val x: Girl.type

这里发生了什么?

1 个答案:

答案 0 :(得分:1)

似乎没有成员的单例类型在某种程度上是类型等价的。也许这是一个错误(你提交了一张票)。例如,以下内容产生运行时错误:

sealed trait Parent
case object Boy  extends Parent
case object Girl extends Parent

trait HasGirl {
  val x: Girl.type
}

case class Thing(x: Boy.type) extends HasGirl {
  def y: Girl.type = (this: HasGirl).x
}


val t = Thing(Boy)
t.y   // ClassCastException !

如果我添加一个成员,则会出现编译时错误:

sealed trait Parent
case object Boy  extends Parent
case object Girl extends Parent { def hello = 1234 }

trait HasGirl {
  val x: Girl.type
}

case class Thing(x: Boy.type) extends HasGirl
<console>:57: error: overriding value x in trait HasGirl of type Girl.type;
 value x has incompatible type
       case class Thing(x: Boy.type) extends HasGirl
                        ^