Почему выбираются члены типа 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 имеет только проекции типов в этом отношении.