2015-11-28 22 views
18

ein einfacher algebraischer Datentyp Parent Gegeben:Unexpected Trait Verhalten

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 

ich ein Merkmal definiert:

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

Dann hat ich einen Fall, Klasse geschaffen, die HasGirl implementiert, sondern gibt einen x Wert von Boy.type.

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

Ich hatte einen Fehler bei der Kompilierung zu erwarten, da ich sehe nicht, wie ein x vom Typ Boy.type-val x: Girl.type entspricht.

Was geht hier vor?

+0

Ist das 'X' in 'Thing' verwandt mit dem 'x' im Merkmal? –

+0

Nun, 'Thing' erweitert' HasGirl'. Da letztere ein 'x' vom Typ' Girl.type' erwartet, glaube ich *, dass 'Thing's 'x: Boy.type' auf' HasGirl's 'x' verweist. –

+2

In der Tat, 'Thing (Boy) .asInstanceOf [HasGirl] .x' produziert' java.lang.ClassCastException: Boy $ kann nicht zu Girl $ 'gewandelt werden. Interessant. – ale64bit

Antwort

1

Es scheint, dass Singleton-Typen ohne Mitglieder hier irgendwie äquivalent sind. Vielleicht ist es ein Fehler (Sie haben ein Ticket eingereicht). Zum Beispiel erzeugt die folgenden ein Laufzeitfehler:

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 ! 

Wenn ich ein Mitglied hinzufügen, erhalten Sie einen Fehler bei der Kompilierung:

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 
         ^
+0

Es ist ein Fehler, per https://issues.scala-lang.org/browse/SI-9574 –