例:構造型スカラー構文定義のためのactuallクラスとは何ですか?
type T = MyClass {def someMethod:String}
それは "trait AnonTrait extends MyClass {def someMethod:String}
" のような形質のコンパイラの作成のために意味するのでしょうか?それとも他のコンパイラのメカニズムを介して行われますか? 私の質問は、このType構文によって実際に隠されていたものでした。
例:構造型スカラー構文定義のためのactuallクラスとは何ですか?
type T = MyClass {def someMethod:String}
それは "trait AnonTrait extends MyClass {def someMethod:String}
" のような形質のコンパイラの作成のために意味するのでしょうか?それとも他のコンパイラのメカニズムを介して行われますか? 私の質問は、このType構文によって実際に隠されていたものでした。
型の作成を隠すわけではありません。基本的には、リフレクションをマスクしてコンパイル時の構造的制約をチェックし、実行時に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を呼び出すためのリフレクションに基づいてコードを生成します。
これを考慮してください:クラスに構造型がありません。クラスの型は常にクラスです。特性はインタフェースを生成する。シングルトンオブジェクトの型もクラスです。
構造型はどこに表示されますか? パラメータと変数の型として。
例えば、def f(s: { def size: Int })
またはval r: { def close(): Unit }
と言うことができます。
ここで、これらのタイプはどのようにバイトコードとして表示されますか? JVMでサポートされていない他のタイプ(Java独自のジェネリックなど)と同様に、はを消去しています。
したがって、他のすべての人(スカラではない)については、上記のs
とr
のタイプはjava.lang.Object
です。
Scala自体については、Scalaが理解できるように、これらの型に関する正確な情報を与える注釈にいくつかの追加情報が格納されています。
ありがとう、そのようなJavaの反射として遅いような構造的制約の使用ですか?それらの光の中では形質が優れています。 – yura
はい、構造型はリフレクションによるパフォーマンスの影響を受けます。 –