8

型フィールドに別のクラスが混在するクラスの型があると言えるのはなぜですか (クラス内で特性のみを混在させることができるのに) ?

例:

scala> class A
defined class A

scala> class B extends A
defined class B

への混在は許可さBれてAいません:

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

しかし、これは可能です:

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

scala> new E
res1: E = E@1f2bc83
4

2 に答える 2

6

ミックスインのインスタンス化と複合型の定義には違いがあります。まず最初に typeA with Bが存在し、正確に typeBです。残念ながら、scala で書くことは完全に合法です。

val x: A with B = new B

そのまま

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

まったく同じタイプを説明しているためです。その型の変数に割り当てることができる値の型に制限を導入しているだけです。もちろん、これらの制限は常にその場合に適用されます。

さらに、Scala は必ずしも型が存在する必要はないことを覚えておく必要があります。つまり、最下位の型Nothingはまったくインスタンス化されない可能性があります。しかしNothing、Scala で表現できるすべての型のサブタイプと同様に、次のような式を記述しても有効です。

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

NothingAnyRef with AnyVal定義により のサブタイプであるため、その宣言は型チェックを行います。

于 2012-07-01T12:55:51.957 に答える
3

これは複合型と呼ばれ、特性とは関係ありません。型が他のいくつかの型のサブタイプであることを表現できます。

それらが発生する可能性がある場所の詳細については、セクション「型処理」のScala タグ情報を参照してください。

于 2012-07-01T10:32:02.830 に答える