type
はscalaでコンパイル時にマクロのように動作する構文的な砂糖だけですか?Scalaで `type`キーワードはどのように実装されていますか
type Bar1 = Foo
type Bar2 = Foo
val bar1 = injector.getInstance(classOf[Bar1])
val bar2 = injector.getInstance(classOf[Bar2])
DIコンテナは2つの「タイプエイリアス」を区別できますか?
type
はscalaでコンパイル時にマクロのように動作する構文的な砂糖だけですか?Scalaで `type`キーワードはどのように実装されていますか
type Bar1 = Foo
type Bar2 = Foo
val bar1 = injector.getInstance(classOf[Bar1])
val bar2 = injector.getInstance(classOf[Bar2])
DIコンテナは2つの「タイプエイリアス」を区別できますか?
これは、同じタイプに別の名前を割り当てる単なる構文糖です。コンパイラーは新しいタイプを生成しないので、同じタイプのタイプ別名を互いに区別することも、元のタイプと区別することもできません。したがって、たとえば:
type Foo = String
def foo(f:Foo)
val s : String = "bar"
foo(s)
コンパイルがうまくいきます。
同様に、DIコンテナは、コンパイル時に2つの異なるタイプが存在しないため、実行時に表示した2つのケースを区別できません。
これは間違っています。http://docs.scala-lang.org/overviews/reflection/symbols-trees-types.html#type-equalityの最後の例を参照してください。私。コンパイラは個別の型を生成しますが、特定の段階で正規化されています。 –
型Foo = String =>定義型エイリアスFoo classOf [Foo] => res0:クラス[Foo] =クラスjava.lang.String – DougC
コンパイラの深いところで別の型を生成する可能性がありますが、実用的な目的では、エイリアスは元のタイプと区別できません。生成されたバイトコードを見るのは面白いでしょうが、実行時にエイリアスが検出されることはありません。 – DougC
私は(classOf
、この場合には意味がありませんが)Scalaの反射とマクロを使用してDIコンテナはそれらを区別することができると思いますが、おそらくいけない:それはむしろ強く少なくとも驚きの原則に反します。より有用には、classOf
が同じであるにもかかわらず、List[Apple]
とList[Orange]
を区別することができます。
私は少しあなたの質問で混乱しています。あなたのタイトルで、*実装されている*、つまり*プラグマティクス*についてどのように尋ねられますか?しかし、問題の本文では、あなたはそれがどのように振る舞うか、すなわち*その意味論*について尋ねます。あなたはどちらに興味がありますか? –