¿Por qué uno selecciona miembros de tipo Scala con un hash en lugar de un punto?

En Scala, la syntax para seleccionar un tipo de una clase es diferente a la de seleccionar cualquier cosa de una clase. En eso, el primero usa un hash como operador de selección en lugar de un punto. ¿Porqué es eso?

Ejemplo: si tenemos una clase como tal …

class Example { type Foo = String } 

¿Por qué seleccionamos el tipo de la clase como este …

 val example:Example#Foo = "1" 

en lugar de esto?

 val example:Example.Foo = "1" 

    Example#Foo se denomina proyección de tipo y coincidirá con cualquier tipo Foo de cualquier instancia adjunta de tipo Example . Si escribe un tipo Example.Foo , el comstackdor buscará el valor (y no el tipo ) llamado Example y solo se referirá a su tipo Foo adjunto. Esto se usa a menudo en el contexto de objetos singleton.

    Por ejemplo:

     object MyEnum extends Enumeration { val EnumValue = Value } val e: MyEnum.Value = MyEnum.EnumValue 

    Si Scala usó . para las proyecciones de tipo, esto generaría confusión porque el identificador anterior podría interpretarse como un tipo o como un valor … De ahí el # . Tenga en cuenta que, como @kassens escribe, Java solo tiene proyecciones de tipo a ese respecto.