Ответ 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 только есть проекции типа в этом отношении.