Summary: | [1.5] AbstractMethodError when using covariant returns | ||
---|---|---|---|
Product: | [Eclipse Project] JDT | Reporter: | Matthew Hall <qualidafial> |
Component: | Core | Assignee: | Kent Johnson <kent_johnson> |
Status: | VERIFIED FIXED | QA Contact: | |
Severity: | critical | ||
Priority: | P3 | ||
Version: | 3.1 | ||
Target Milestone: | 3.1 M5 | ||
Hardware: | PC | ||
OS: | Windows XP | ||
Whiteboard: | |||
Bug Depends on: | 83901 | ||
Bug Blocks: |
Description
Matthew Hall
2005-01-27 21:39:13 EST
We can't be sure this bug is really fixed until 83901 is fixed. I'm encountering an AbstractMethodError involving a covariant return override as well. Mine has nothing to do with enums, and is with build I20050202-0800. My class hierarchy is very complex, and I don't have a small reproducer yet, but a summary is: interface Visibility {} interface NamedObject {} interface Function extends NamedObject {} interface ClassMember { Visibility getVisibility(); } class FooVisibility implements Visibility {} class FooFunction implements Function { FooVisibility getVisibility(); } interface FooClassMember { FooVisibility getVisibility(); } class FooMemberFunction extends FooFunction implements FooClassMember {} void foo(NamedObject o) { ClassMember member = (ClassMember) o; member.getVisibility(); // AbstractMethodError } Forgot to add: foo() is called with a FooMemberFunction object. Here's a reproducer: public final class Bug83902 { public interface Visibility { } public interface Function { } public interface ClassMember { Visibility getVisibility(); } public interface MemberFunction extends Function, ClassMember { } public static class FooVisibility implements Visibility { public static final FooVisibility PUBLIC = new FooVisibility(); } public static class FooFunction implements Function { public FooVisibility getVisibility() { return FooVisibility.PUBLIC; } } interface FooClassMember extends ClassMember { FooVisibility getVisibility(); } public static class FooMemberFunction extends FooFunction implements MemberFunction, FooClassMember { } public static void main(String[] args) { FooMemberFunction fmf = new FooMemberFunction(); fmf.getVisibility(); // OK FooClassMember fcm = fmf; fcm.getVisibility(); // OK ClassMember cm = fmf; cm.getVisibility(); // AbstractMethodError } } Exception in thread "main" java.lang.AbstractMethodError: Bug83902$FooMemberFunction.getVisibility()LBug83902$Visibility; at Bug83902.main(Bug83902.java:55) On second scenario, we are missing one bridge method on FooMemberFunction: public bridge synthetic X.IVisibility getVisibility(); the problem in comment 0 is fixed. the missing bridge method problem in comment 4 can be reproduced with: public class X { interface I {} interface J { I getVisibility(); } static class A implements I {} static class B { public A getVisibility() { return null; } } static class C extends B implements J {} public static void main(String[] args) { C c = new C(); c.getVisibility(); // OK J j = c; j.getVisibility(); // AbstractMethodError } } We are missing the bridge method on the class C because of the inherited methods from B & J Verified in I20050215-2300 |