In Scala, the syntax for selecting a type from a class is different from that of selecting anything else from a class. In that the former uses a hash as the selection operator instead of a dot. Why is that?
Example: If we have a class like so…
class Example {
type Foo = String
}
Why do we select the type from the class like this…
val example:Example#Foo = "1"
instead of like this?
val example:Example.Foo = "1"
Example#Foois called a type projection and will match any typeFooof any enclosing instance of typeExample. If you write a typeExample.Foo, the compiler will look for the value (and not type) calledExampleand will refer to its enclosingFootype only. This is often used in the context of singleton objects.For instance:
If Scala used
.for type projections, this would lead to confusion because the preceding identifier could be interpreted either as a type or as a value… Hence the#. Note that, as @kassens writes, Java only has type projections in that respect.