Почему выбираются члены типа Scala с хешем вместо точки?

В Scala синтаксис выбора типа из класса отличается от синтаксиса выбора чего-либо еще из класса. В том, что первый использует хэш в качестве оператора выбора вместо точки. Это почему?

Пример: если у нас есть такой класс...

class Example {
    type Foo = String
}

Почему мы выбираем тип из класса, как это...

val example:Example#Foo = "1"

а не так?

val example:Example.Foo = "1"

1 ответ

Решение

Example#Foo называется проекцией типа и будет соответствовать любому типу Foo любого включающего экземпляра типа Example, Если вы напишите тип Example.Fooкомпилятор будет искать значение (а не тип) с именем Example и будет ссылаться на его вложение Foo только тип Это часто используется в контексте одноэлементных объектов.

Например:

object MyEnum extends Enumeration {
  val EnumValue = Value
}

val e: MyEnum.Value = MyEnum.EnumValue

Если Scala используется . для проекций типов это может привести к путанице, поскольку предыдущий идентификатор может быть интерпретирован как тип или как значение… Следовательно, #, Обратите внимание, что, как пишет @kassens, Java имеет только проекции типов в этом отношении.

Другие вопросы по тегам