Re: Strange runtime error: AbstractMethodError
"Oliver Wong" <owong@castortech.com> wrote in message
news:7Oryh.94111$vT5.1685226@wagner.videotron.net...
After a bit for trimming, I've formed an SSCCE that doesn't require any
external libraries:
<SSCCE>
interface Root {
public Root someMethod();
}
interface Intermediary extends Root {
public Leaf someMethod();
}
class Leaf implements Intermediary {
@Override
public Leaf someMethod() {
return null;
}
}
public class BugTest {
public static void main(String[] args) {
Leaf leafReference = new Leaf();
leafReference.someMethod();
Root rootReference = leafReference;
rootReference.someMethod(); /* throws error */
}
}
</SSCCE>
<output>
Exception in thread "main" java.lang.AbstractMethodError:
Leaf.someMethod()LRoot;
at BugTest.main(BugTest.java:21)
</output>
Using JDK 1.4, this won't compile. Which makes sense, since covariant
return types were introduced in 1.5. In case anyone's interested, the
errors are:
Intermediary.java:2: someMethod() in Intermediary clashes with someMethod()
in Root; attempting to use incompatible return type
found : Leaf
required: Root
public Leaf someMethod();
^
Leaf.java:4: someMethod() in Leaf cannot implement someMethod() in Root;
attempting to use incompatible return type
found : Leaf
required: Root
public Leaf someMethod() {
^
Using jdk1.5.0_05's javac, I get the error:
Leaf.java:3: method does not override a method from its superclass
@Override
Which is true, I suppose. Commenting out the annotation, it all compiles
correctly and runs successfully as well (still using jdk1.5.0_05) . Since
javap shows that the overload being called is Root.someMethod:()LRoot;,
there must be some logic in the JVM to realize that someMethod:()LLeaf; is
"close enough".
So it appears that the problem (in your SSCCE, at least) is a JVM bug.