una tipos teoria son rasgos personalidad persona los liderazgo ejemplos cuáles cattell allport scala traits

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 ^