2012-07-01 6 views
8

タイプフィールドに、別のクラスが混在しているクラスの型があると言うことができます(クラス内でのみ特性を混合できる場合)。タイプフィールドのクラスで混在するのはなぜですか?

例:

scala> new A with B 
<console>:10: error: class B needs to be a trait to be mixed in 
      new A with B 
         ^

しかし、これは可能です::ABにミキシング

scala> class A 
defined class A 

scala> class B extends A 
defined class B 

は許可されていません

scala> class E {type T = A with B} 
defined class E 

scala> new E 
res1: E = [email protected] 
+0

私にバグのように見えます。 –

答えて

3

これはcompound typeと呼ばれ、に何の関係もありません形質と関係するこれは、あるタイプが他のいくつかのタイプのサブタイプであることを表現することを可能にします。

詳細については、「タイプ処理」のセクションのScala tag infoを参照してください。

+0

それは質問に答えません:なぜこれは可能ですか? –

+1

@RobinGreen:なぜそれは可能ではありませんか? 'new A with B'は* mixin * BをAに変換することを意味し、type T = A with BはTがA型* B *型であることを意味する。 – sschaef

+2

@Antoras - 質問は有効です。 2つのクラスを混在させることはできないので、2つのクラスの複合タイプを持つことができる便利な状況は何ですか?システム全体は依然として健全ですが、 'A with B'の2つの型がクラスを参照するためにコンパイラに知られている場合、警告が出る可能性があると主張できます。 –

6

mixinのインスタンス化と複合型の定義には違いがあります。それはそれはまったく同じタイプを説明して

val y: Any with AnyRef with A with B = new B 

あるよう

val x: A with B = new B 

を書くためにScalaで完全に合法である悲しいかな、すべてのタイプA with Bの まず、正確にタイプBを存在しています。 そのタイプの変数に割り当てることができる値のタイプに制限を導入するだけです。 このような制限は、常にその場合に当てはまります。

さらに、Scalaは必ずしも型が存在する必要はありません。つまり、下部の型Nothingはインスタンス化されていない可能性があります。 しかしNothingはScalaで表現することができるあらゆるタイプのサブタイプであるとして、

def foo: AnyRef with AnyVal = sys.error("IMPOSSIBRU!") 

Nothingのような式を書くことさえ有効ではこのようにその宣言のtypechecks定義によってAnyRef with AnyValのサブタイプです。

関連する問題