gpt4 book ai didi

java - 包私有(private)方法覆盖时发生AbstractMethodError

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:23:34 24 4
gpt4 key购买 nike

我注意到执行以下代码时发生了 AbstractMethodError。

package javapkg;

public abstract class JavaClass{
abstract String foo(int b);

public String bar(int b){
return foo(b);
}
}
package scalapkg

import javapkg._

class ScalaClass extends JavaClass{
def foo(a:Int) = a.toString
}

object Main extends App{
println(new ScalaClass().bar(10))
}
[error] (run-main) java.lang.AbstractMethodError: javapkg.JavaClass.foo(I)Ljava/lang/String;
java.lang.AbstractMethodError: javapkg.JavaClass.foo(I)Ljava/lang/String;
at javapkg.JavaClass.bar(JavaClass.java:7)
at scalapkg.Main$delayedInit$body.apply(ScalaClass.scala:10)
at scala.Function0$class.apply$mcV$sp(Function0.scala:34)
at scala.runtime.AbstractFunction0.apply$mcV$sp(AbstractFunction0.scala:12)
at scala.App$$anonfun$main$1.apply(App.scala:60)
at scala.App$$anonfun$main$1.apply(App.scala:60)
at scala.collection.LinearSeqOptimized$class.foreach(LinearSeqOptimized.scala:59)
at scala.collection.immutable.List.foreach(List.scala:76)
at scala.collection.generic.TraversableForwarder$class.foreach(TraversableForwarder.scala:30)
at scala.App$class.main(App.scala:60)
at scalapkg.Main$.main(ScalaClass.scala:9)
at scalapkg.Main.main(ScalaClass.scala)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
java.lang.RuntimeException: Nonzero exit code: 1
at scala.sys.package$.error(package.scala:27)

这是错误还是规范?

附言Scala version 2.9.2 , 2.10.0-M3 and 2.10.0-SNAPSHOT (2.10.0-20120507-163905-843ac9520c) 出现同样的错误

最佳答案

有点复杂。这是一个错误——Scala 编译器应该发出一个错误——但它有点微妙。

问题在于,由于您已将抽象方法从 public 中删除,因此它的可见性是包私有(private)的。如果你用 Java 写这个:

package javapkgimpl;

public class JavaClassImpl extends javapkg.JavaClass {
String foo(int b) { return (new java.lang.Integer(b)).toString(); }
public static void main(String[] args) {
System.out.println(new JavaClassImpl().bar(10));
}
}

然后 Java 编译器会报错:

JavaClassImpl.java:3: javapkgimpl.JavaClassImpl is not abstract and does not
override abstract method foo(int) in javapkg.JavaClass
public class JavaClassImpl extends javapkg.JavaClass {
^
1 error

它显然是尝试覆盖,但它实际上不起作用,因为它不在正确的包中,因此无法实际访问(或覆盖)原始 foo。如果我们将包更改为 javapkg,那么一切正常。如果我们改用这个 Scala:

package javapkg

class ScalaClass extends JavaClass{
def foo(a:Int) = a.toString
}

object ScalaClass extends App{
println(new ScalaClass().bar(10))
}

那么 Scala 也可以正常工作。

这是 Scala 编译器的错误,它没有注意到这个错误——它应该发出与 Java 编译器相同的错误(或者更有用的一个实际上告诉你访问是错误的!)而不是发出无法工作的字节码。

但它很容易修复:只需更改 Scala 代码上的包(或 Java 代码中的访问修饰符)。

关于java - 包私有(private)方法覆盖时发生AbstractMethodError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10555806/

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