Почему выбирают члены типа Scala с хешем вместо точки?
В Scala синтаксис выбора типа из classа отличается от синтаксиса выбора любого другого из classа. В том, что первый использует hash как оператор выбора вместо точки. Почему это?
Пример: если у нас есть class вроде …
class Example { type Foo = String }
Почему мы выбираем тип из этого classа …
val example:Example#Foo = "1"
вместо этого?
val example:Example.Foo = "1"
Example#Foo
называется проекцией типа и будет соответствовать любому типу Foo
любого охватывающего экземпляра типа Example
. Если вы пишете тип Example.Foo
, компилятор будет искать значение (а не тип ), которое называется Example
и будет ссылаться только на его охватывающий тип Foo
. Это часто используется в контексте одноэлементных объектов.
Например:
object MyEnum extends Enumeration { val EnumValue = Value } val e: MyEnum.Value = MyEnum.EnumValue
Если используется Скала .
для outlookов типа это приведет к путанице, потому что предыдущий идентификатор можно интерпретировать либо как тип, либо как значение … Следовательно, #
. Обратите внимание, что, как пишет @kassens, у Java только есть проекции типа в этом отношении.