私はこのコードを期待しています(洗練された型でパターンマッチを使用した後に匿名クラスのメソッドを呼び出します)
(new {
def foo : Unit = println("Called foo method")
} : Any) match {
case f : {def foo : Unit} ⇒
println("Has foo method")
f.foo
}
印刷する
Has foo method
Called foo method
(未確認の警告も同様)。
タイプの消去により一致が常に成功することは知っていますが、実行時のタイプ(消去を考慮しても)f
は$anon$NameOfSomeAnonymousClassThatHasAfooMethod
Scala REPL (2.9.1) に入ると、実際にスローされNoSuchMethodException
ます:
<console>:11: warning: refinement AnyRef{def foo: Unit} in type pattern AnyRef{def foo: Unit} is unchecked since it is eliminated by erasure
case f : {def foo : Unit} ⇒
^
Has foo method
java.lang.NoSuchMethodException: $anon$1.foo()
at java.lang.Class.getMethod(Class.java:1622)
at .reflMethod$Method1(<console>:13)
at .<init>(<console>:13)
at .<clinit>(<console>:13)
at .<init>(<console>:11)
at .<clinit>(<console>)
at $print(<console>)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:616)
at scala.tools.nsc.interpreter.IMain$ReadEvalPrint.call(IMain.scala:704)
at scala.tools.nsc.interpreter.IMain$Request$$anonfun$14.apply(IMain.scala:920)
at scala.tools.nsc.interpreter.Line$$anonfun$1.apply$mcV$sp(Line.scala:43)
at scala.tools.nsc.io.package$$anon$2.run(package.scala:25)
at java.lang.Thread.run(Thread.java:679)
なんで?
編集
一番の原因はfoo
プライベートとして生成されていることがわかりました。回答でこの原因について推測しましたが、よくわかりません。アイデアがあれば、回答として投稿してください。