Смотрите здесь:
scala> class X {
| def m1 = 1
| protected def m2 = 2
| private def m3 = 3
| }
defined class X
scala> class Y extends X {
| def m4 = 4
| }
defined class Y
scala> val x: X = new Y
x: X = Y@12524b0
scala> x.
asInstanceOf equals getClass hashCode isInstanceOf m1 m2 m4
notify notifyAll toString wait
Итак, m2
появляется, даже если вы не можете использовать его, потому что он защищен, и m4
появляется, даже если вы не можете использовать его (без приведения или сопоставления), потому что тип x
равен X
, а m4
относится к классу Y
(фактический class
, а не type
из x
).
Следующий вопрос: это намеренно? Ну, не совсем, но есть вещи более высокого приоритета, которые нужно исправить. Патчи приветствуются, конечно. : -)