13

これは期待どおりに機能しません (run外部からパッケージ private を呼び出そうとしているためServices):

object Services {
 class HelloPrinter {
   private[Services] def run = "Hello"
  }  
}

val obj = new Services.HelloPrinter

しかし、驚くべきことにこれはうまくいきます:

val obj: {def run: String} = new Services.HelloPrinter
obj.run

HelloPrinter はパッケージの可視性ルールのために構造型と一致しないため、コンパイラのバグであると言えます。コンパイルする必要はまったくありません。

次の例では、プログラムはコンパイルされますが、実行時例外 ( java.lang.NoSuchMethodException)がスローされます。

class HelloPrinter {
  private[HelloPrinter] def run = "Hello"
}  

val obj: {def run: String} = new HelloPrinter
obj.run

これは私が見逃している言語機能またはルールですか、それとも合法的に Scala のバグですか?

4

1 に答える 1