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