2011-08-31 14 views
5

例:構造型スカラー構文定義のためのactuallクラスとは何ですか?

type T = MyClass {def someMethod:String} 

それは "trait AnonTrait extends MyClass {def someMethod:String}" のような形質のコンパイラの作成のために意味するのでしょうか?それとも他のコンパイラのメカニズムを介して行われますか? 私の質問は、このType構文によって実際に隠されていたものでした。

答えて

3

型の作成を隠すわけではありません。基本的には、リフレクションをマスクしてコンパイル時の構造的制約をチェックし、実行時にsomeMethodを呼び出します。例えば

お持ちの場合は、:

class Foo(t: MyClass {def someMethod:String}) { 
    def CallSomeMethod = t.someMethod 
} 

をこれはあなたのFooクラスのコンストラクタも(のsomeMethodがトレイトを経てMyClassの中に混合することができる)のsomeMethodを持つMyClass型のトンを受け付けます。あなたは持っている可能性があり :

class MyClass {} 
trait WithSomeMethod {def someMethod = "hello"} 

、あなたは、このようなFooの作成することができます。あなたはnew Foo(mc)を作成するときに、コンパイラはそのMCをチェックするためにリフレクションを使用して、今

val mc = new MyClass with WithSomeMethod 
val foo = new Foo(mc) 
println(foo.CallSomeMethod) // prints "hello" 

ものsomeMethodを持ってMyClassのです。実際の電話番号はfoo.CallSomeMethodです。今

あなたが行ったようにやって(私は...あなたの実際の質問に取得しています、私と一緒にクマ):

type T = MyClass {def someMethod:String} 

だけ具体的なタイプ、タイプエイリアスを作成していません。これは以前に与えられたのFooの定義に相当し

class Foo(t: T) { 
    def CallSomeMethod = t.someMethod 
} 

:あなたはTがそのように定義したら、あなたはFooのように定義することができます。 MyClass {def someMethod:String}を使用した可能性がある他の場所で再利用できるエイリアスTを作成しました。実際のT型は生成されず、コンパイラはTを参照するたびにリフレクションを使用して、someMethodが定義されている構造的制約をチェックし、someMethodを呼び出すためのリフレクションに基づいてコードを生成します。

+0

ありがとう、そのようなJavaの反射として遅いような構造的制約の使用ですか?それらの光の中では形質が優れています。 – yura

+0

はい、構造型はリフレクションによるパフォーマンスの影響を受けます。 –

3

特性を作成しません。タイプ別名は、Tを参照するたびにMyClass {def someMethod:String}を参照することを意味します。ただし、型宣言を特性でオーバーライドすることができます。

trait A 

class B { 
    type T <: A 
} 

class SubB { 
    trait T extends A 
} 
+0

私の質問は、このタイプの構文によって実際に隠されていたものでした。 – yura

+0

私の答えは、タイプエイリアスでした。 – Nicolas

3

これを考慮してください:クラスに構造型がありません。クラスの型は常にクラスです。特性はインタフェースを生成する。シングルトンオブジェクトの型もクラスです。

構造型はどこに表示されますか? パラメータと変数の型として。

例えば、def f(s: { def size: Int })またはval r: { def close(): Unit }と言うことができます。

ここで、これらのタイプはどのようにバイトコードとして表示されますか? JVMでサポートされていない他のタイプ(Java独自のジェネリックなど)と同様に、を消去しています。

したがって、他のすべての人(スカラではない)については、上記のsrのタイプはjava.lang.Objectです。

Scala自体については、Scalaが理解できるように、これらの型に関する正確な情報を与える注釈にいくつかの追加情報が格納されています。

関連する問題