Вы ошибаетесь, когда думаете
это явная версия того же кода, что и раньше
Master#DataType
и master.DataType
- это два разных типа.
master.DataType
- это тип тех экземпляров DataType
, которые имеют master
в качестве внешнего объекта. Другими словами, именно то, что вы спрашиваете, но очевидно, что master
является частью типа, и тип не может быть отображен, если master
нет.
Master#DataType
- это тип любого экземпляра DataType
для любого внешнего объекта (эквивалент Master.DataType
в Java).
ОТВЕТИТЬ НА КОММЕНТАРИЙ:
Элементы типа могут быть переопределены в подклассе (включая анонимный подкласс, содержащий только один объект), но только с помощью совместимого типа. И в вашем примере DataType
уже конкретен в Master
, поэтому единственный совместимый класс с ним - это сам. Так что-то вроде
val a = new Master {
override type DataType = String
}
не проверяет тип, что имеет смысл: вы получите var counter: String = 0
, что является чепухой. Но
val a = new Master {
override type DataType = Int
}
будет работать (но не слишком полезно).
Так что имеет смысл переопределять abstract членов типа. Но они проверяются по типу так же, как и внутренние классы, поэтому a.DataType
обычно не считается таким же, как b.DataType
- даже если они на самом деле не могут отличаться!