scala - tipos - teoria de los rasgos pdf
Comportamiento inesperado del rasgo (1)
Dado un tipo de datos algebraico simple del 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
Definí un rasgo:
scala> trait HasGirl {
| val x: Girl.type
| }
defined trait HasGirl
Luego, creé una clase de caso que implementó HasGirl
, pero proporcionó un valor x
de Boy.type
.
scala> case class Thing(x: Boy.type) extends HasGirl
defined class Thing
Esperaba un error de compilación, ya que no veo cómo una x
de tipo Boy.type
ajusta a val x: Girl.type
.
¿Que está pasando aqui?
Parece que los tipos de singleton sin miembros son de algún tipo equivalentes aquí. Tal vez sea un error (usted archivó un boleto). Por ejemplo, lo siguiente produce un error de tiempo de ejecución:
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 !
Si agrego un miembro, obtienes un error en tiempo de compilación:
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 ^