Scala: Разница между типом A = XXX и окончательным типом A = XX? - PullRequest
6 голосов
/ 14 марта 2019

при условии, что у меня есть абстрактный тип AA и конкретный тип XXX:

trait AA {
  type A = XXX
  final type B = XXX
}

В этом случае в любом подклассе AA нельзя переопределить оба типа A и B, поэтому кажется, что ключевое слово final полностью избыточен.Это утверждение правильно?

1 Ответ

7 голосов
/ 14 марта 2019

Трудно доказать, что они абсолютно идентичны, но я собираюсь доказать, что они есть, за исключением нескольких бесполезных причуд.

Бесполезные причуды

Во-первых, и наиболее очевидно, они дают разные сообщения об ошибках. Но это еще не все: технически возможно переопределить 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 для другого типа. Подробности смотрите в этом ответе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...