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

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

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

class Example {
    type Foo = String
}

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

val example:Example#Foo = "1"

вместо этого?

val example:Example.Foo = "1"

Ответ 1

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

Например:

object MyEnum extends Enumeration {
  val EnumValue = Value
}

val e: MyEnum.Value = MyEnum.EnumValue

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