gpt4 book ai didi

java - 为什么存在这样的方法时会抛出 `NoSuchMethodException`?

转载 作者:行者123 更新时间:2023-11-29 03:44:34 24 4
gpt4 key购买 nike

我期待这段代码(在精化类型上使用模式匹配后调用匿名类的方法)

(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 被生成为私有(private)的。我在回答中推测了造成这种情况的原因,但我不确定。如果您有任何想法,请随时将其作为答案发布!

最佳答案

I know the match always succeeds due to type erasure, but that shouldn't cause the problem, since the run-time type (even considering erasure) of f should be $anon$NameOfSomeAnonymousClassThatHasAfooMethod

从某种意义上说,它“应该”是显而易见的实现并且是您所期望的;它不需要,正如您所发现的,它不需要。

细化上的模式匹配是盲投。你必须有很大的信心。

This is odd because Scala methods are supposed to be public by default.

您在源代码中声明的方法默认是公开的。实现细节不是。

I suspect the cause is that the compiler wrongly assumes that since the class is anonymous, its defined methods are uncallable from outside the class.

编译器正确地假定您必须违反协议(protocol)条款才能直接调用匿名类的任何方法。您投出您的引用资料并把握机会。

关于java - 为什么存在这样的方法时会抛出 `NoSuchMethodException`?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11608526/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com