Хорошо, это сложно.Ваш вопрос: «Так почему же Scala не просто запрещает комбинацию модификаторов private final?» основана на предположении, что эта комбинация не имеет смысла.
Допустим, вы правы (и вы, за исключением крошечной детали, которая будет упомянута позже).Я не парень компилятор, но с моей точки зрения "просто запретить", вероятно, не так просто (по крайней мере, в этом случае).И почему кто-то пытается это сделать?Каковы компромиссы?Только то, что что-то бесполезно, не обязательно означает, что оно приносит вред.Только не используйте это ...
Теперь вот крошечная деталь, которую вы, кажется, упустили из виду.Модификатор private
является модификатором видимости, что означает, что class B
не знает о его существовании.Но модификаторы видимости Scala немного сложнее, чем, скажем, Java.Предположим, что по какой-либо причине вам потребуется код, показанный в следующем фрагменте кода, компилятор не допустит его.
package scope
class A {
def callFoo = foo;
private[scope] final def foo = "bar of A"
}
class B extends A {
private[scope] final def foo = "bar of B"
}
object Main extends App {
println((new A()).callFoo)
println((new B()).callFoo)
}
Это одна из ошибок, предоставленных компилятором: "method fooне может переопределить последний элемент ".
Итак, поехали.Scala просто запрещает эту комбинацию;)