If you have come from Java, most of these things may not be surprising. As such, let's look at some other features of Scala's type system.
Abstract type members are type members of an object or class that are left abstract. They can provide some abstraction without the verbosity of type parameters. If a type is intended to be used existentially in most cases, we can cut some verbosity by using a type member instead of a parameter.
class Operator { type ToolOfChoice } class Susan extends Operator { type ToolOfChoice = Hammer } class Operator[ToolOfChoice] class Susan extends Operator[ToolOfChoice]
You can refer to an abstract type variable using the hash operator:
scala> val tool: Susan#ToolOfChoice = new Hammer tool: Hammer = Hammer@d8756ac