记录前些天遇到的一个问题,scala里protected或private修饰的方法可能在编译为class时变成了public,这已经不是第一次遇到,最早遇到是在写一个java子类时要覆盖一些父类方法,父类是scala写的一个trait,里面的方法修饰为protected,当时IDE提示我override的方法必须声明为public感到奇怪反编译了一下父trait果然被声明为了public。而这次遇到的稍有不同,跟继承没有关系,用下面的demo举例:➜ cat A.scala
class A {
private[this] def foo() = {
List(1,2,3).map(i => bar(i))
}
private[this] def bar(i:Int):String = {
"str:" + i
}
}当我们编译上面类之后,里面的foo和bar方法的修饰符最终在class里会有所不同,反编译后可看到bar修饰符变成了public:➜ cfr-decompiler A
...
public class A {
private Listfoo() {
return (List)List..MODULE$.apply((Seq)Predef..MODULE$.wrapIntArray(new int[]{1,
...
继续阅读
(26)