2017-01-24 10 views
0

typeはscalaでコンパイル時にマクロのように動作する構文的な砂糖だけですか?Scalaで `type`キーワードはどのように実装されていますか

type Bar1 = Foo 
type Bar2 = Foo 
val bar1 = injector.getInstance(classOf[Bar1]) 
val bar2 = injector.getInstance(classOf[Bar2]) 

DIコンテナは2つの「タイプエイリアス」を区別できますか?

+0

私は少しあなたの質問で混乱しています。あなたのタイトルで、*実装されている*、つまり*プラグマティクス*についてどのように尋ねられますか?しかし、問題の本文では、あなたはそれがどのように振る舞うか、すなわち*その意味論*について尋ねます。あなたはどちらに興味がありますか? –

答えて

1

これは、同じタイプに別の名前を割り当てる単なる構文糖です。コンパイラーは新しいタイプを生成しないので、同じタイプのタイプ別名を互いに区別することも、元のタイプと区別することもできません。したがって、たとえば:

type Foo = String 
def foo(f:Foo) 
val s : String = "bar" 
foo(s) 

コンパイルがうまくいきます。

同様に、DIコンテナは、コンパイル時に2つの異なるタイプが存在しないため、実行時に表示した2つのケースを区別できません。

+0

これは間違っています。http://docs.scala-lang.org/overviews/reflection/symbols-trees-types.html#type-equalityの最後の例を参照してください。私。コンパイラは個別の型を生成しますが、特定の段階で正規化されています。 –

+0

型Foo = String =>定義型エイリアスFoo classOf [Foo] => res0:クラス[Foo] =クラスjava.lang.String – DougC

+0

コンパイラの深いところで別の型を生成する可能性がありますが、実用的な目的では、エイリアスは元のタイプと区別できません。生成されたバイトコードを見るのは面白いでしょうが、実行時にエイリアスが検出されることはありません。 – DougC

1

私は(classOf、この場合には意味がありませんが)Scalaの反射とマクロを使用してDIコンテナはそれらを区別することができると思いますが、おそらくいけない:それはむしろ強く少なくとも驚きの原則に反します。より有用には、classOfが同じであるにもかかわらず、List[Apple]List[Orange]を区別することができます。

関連する問題