javac bug: Resolving conflicting defenders in interfaces

Brian Goetz brian.goetz at oracle.com
Thu Oct 28 10:51:59 PDT 2010


Here, we have interfaces with conflicting defenders, and we try and resolve 
the conflict in a subinterface:

     private interface A {
         public extension int get() default Implementations.one;
     }

     private interface E {
         public extension int get() default Implementations.two;
     }

     private interface F extends A, E {
         public extension int get() default Implementations.two;
     }

test-compile:
     [javac] Compiling 1 source file to 
/home/brian/work/mangler/trunk/defender/build/test-classes
     [javac] 
/home/brian/work/mangler/trunk/defender/test/src/junit/MultipleInheritanceTest.java:25: 
types E and A are incompatible; both define get(), but with unrelated default 
implementations
     [javac]     private interface F extends A, E {
     [javac]             ^
     [javac] 1 error


I would argue this case should be allowed because F provides an unambiguous 
default for get().  (The resolution rules say that any defender provided by F 
"shadows" the defender provided by F's superinterfaces.)

The compiler does get this right when F is a real class and F provides an 
implementation of get().



More information about the lambda-dev mailing list