2017-01-24 3 views
0

type В scala только синтаксический сахар, который действует как макрос во время компиляции, или есть какая-то другая магия? В такой ситуации:Какое ключевое слово `type` реализовано в Scala

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

Может ли контейнер DI различать два «псевдонима типа»?

+0

Я немного смущен вашим вопросом. В своем названии вы спрашиваете, как он * реализован *, т. Е. О его * прагматике *. Но в вопросительном теле вы спрашиваете, как вести себя * конкретный *, т. Е. О его * семантике *. На кого вас интересует? –

ответ

1

Это просто синтаксический сахар, который назначает другое имя тому же типу. Компилятор не генерирует новый тип, поэтому не может различать псевдонимы типов одного и того же типа друг от друга или от исходного типа. Так, например:

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

будет компилироваться просто отлично.

Точно так же контейнер DI не сможет отличить два случая, которые вы показывали во время выполнения, поскольку во время компиляции никогда не было двух разных типов.

+0

Это неправильно, см. Последний пример в http://docs.scala-lang.org/overviews/reflection/symbols-trees-types.html#type-equality. То есть компилятор _does_ генерирует отдельные типы, они просто нормализуются на определенном этапе. –

+0

Тип Foo = String => определенный псевдоним типа Foo classOf [Foo] => res0: Class [Foo] = класс java.lang.String – DougC

+0

, так что может быть, что в глубине компилятора он генерирует отдельный тип, но для всех В практических целях псевдоним неотличим от исходного типа. Было бы интересно увидеть сгенерированный байт-код, но я подозреваю, что нет ничего, что позволило бы обнаружить псевдоним во время выполнения. – DougC

1

Я думаю, что DI контейнер с помощью Scala отражение и макросы может отличить их (хотя classOf не имеет смысла в данном случае), но, вероятно, не следует: это нарушило бы принцип наименьшего удивления довольно сильно. Скорее, более полезно, он может различать List[Apple] и List[Orange], несмотря на то, что их classOf - это то же самое.

Смежные вопросы