2015-11-28 18 views
18

予期しない形質:私はトレイト定義さ <code>Parent</code>の簡単な代数的データ型を考えると行動

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 

私はタイプBoy.typexval x: Girl.typeに準拠してどのように表示されていないので、私は、コンパイル時エラーを予想していました。

ここでは何が起こっていますか?

+0

は 'Thing'で 'X'です形質の 'x'に関連していますか? –

+0

さて、「Thing」は、「HasGirl」を拡張しています。後者は 'Girl.type'型の' x'型を期待しているので、 'Thing'の' x:Boy.type'は 'HasGirl'の' x'に対応しています。 –

+2

実際、 'Thing(Boy).asInstanceOf [HasGirl] .x'は' java.lang.ClassCastException:Boy $をGirl $にキャストできません。 'を生成します。面白い。 – ale64bit

答えて

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

これはバグです。https://issues.scala-lang.org/browse/SI-9574 –

関連する問題