[Scala]protectedなメンバはclassファイルではprotectedではない。

privateなメンバを持つクラスをコンパイルして、どの様なclassファイルが生成されるか調べてみました。

class PrivateClass {
	private val foo = "foo"
	private def bar() { println("bar()") }
}
$ javap -private PrivateClass
Compiled from "Point2D.scala"
public class PrivateClass extends java.lang.Object implements scala.ScalaObject{
    private final java.lang.String foo;
    private java.lang.String foo();
    private void bar();
    public PrivateClass();
}

どちらもprivateです。
では、protectedなメンバの場合はどうなるでしょうか?

class ProtectedClass {
	protected val foo = "foo"
	protected def bar() { println("bar()") }
}
$ javap -private ProtectedClass
Compiled from "Point2D.scala"
public class ProtectedClass extends java.lang.Object implements scala.ScalaObject{
    private final java.lang.String foo;
    public java.lang.String foo();
    public void bar();
    public ProtectedClass();
}

驚くことに、変数はprivateに、メソッドはpublicになりました。



うーむ。
scalaの場合、objectやtraitなどがあるので、protectedのままではうまくいかないのかな?
それでこーなっている???