Трудно доказать, что они абсолютно идентичны, но я собираюсь доказать, что они есть, за исключением нескольких бесполезных причуд.
Бесполезные причуды
Во-первых, и наиболее очевидно, они дают разные сообщения об ошибках. Но это еще не все: технически возможно переопределить A
, вы просто не можете переопределить что-либо кроме XXX
:
trait A1 extends AA {
override type A = XXX // Compiles, but doesn't really do anything.
}
С другой стороны, вы никогда не сможете переопределить B
:
trait A2 extends AA {
override type B = XXX // Does not compile.
}
Есть ли полезные отличия?
Опять же, я собираюсь утверждать, что нет. В очень подробном ответе на вопрос Возможно ли переопределить поле типа , пользователь StackOverflow 0 __ отмечает, что
type T = C
неизбежно исправляет T
, что в некотором роде соответствует созданию метода final
.
и
Теперь вы можете легко увидеть, что запрещается дальнейшее «переопределение» T
с последующим объяснением того, как система типов будет несовместима, если вы сможете переопределить T
для другого типа. Подробности смотрите в этом ответе.