FULL PRODUCT VERSION :
java version "1.8.0_31"
Java(TM) SE Runtime Environment (build 1.8.0_31-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.31-b07, mixed mode)
ADDITIONAL OS VERSION INFORMATION :
Linux fbassi 3.16.0-4-amd64 #1 SMP Debian 3.16.7-ckt4-1 (2015-01-16) x86_64 GNU/Linux
A DESCRIPTION OF THE PROBLEM :
The compilation of classes/interfaces that use templates / generic types produce weird errors.
You can easily reproduce the bug compiling the simple class in "Steps to Reproduce".
Below you can find an example that can be easily workarounded, but in the real life, it's very difficult to workaround complex applications.
REGRESSION. Last worked in version 8u11
ADDITIONAL REGRESSION INFORMATION:
java version "1.8.0_11"
Java(TM) SE Runtime Environment (build 1.8.0_11-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.11-b03, mixed mode)
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
javac Ident.java
EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
Compiler should compile without any error.
ACTUAL -
> javac Ident.java
An exception has occurred in the compiler (1.8.0_31). Please file a bug at the Java Developer Connection (http://java.sun.com/webapps/bugreport) after checking the Bug Parade for duplicates. Include your program and the following diagnostic in your report. Thank you.
java.lang.AssertionError: isSubClass E
at com.sun.tools.javac.code.Symbol.isSubClass(Symbol.java:447)
at com.sun.tools.javac.code.Symbol.isMemberOf(Symbol.java:456)
at com.sun.tools.javac.code.Symbol$MethodSymbol.overrides(Symbol.java:1469)
at com.sun.tools.javac.code.Types$ImplementationCache.implementationInternal(Types.java:2671)
at com.sun.tools.javac.code.Types$ImplementationCache.get(Types.java:2653)
at com.sun.tools.javac.code.Types.implementation(Types.java:2682)
at com.sun.tools.javac.code.Symbol$MethodSymbol.implementation(Symbol.java:1529)
at com.sun.tools.javac.code.Symbol$MethodSymbol.implementation(Symbol.java:1518)
at com.sun.tools.javac.comp.Resolve.notOverriddenIn(Resolve.java:416)
at com.sun.tools.javac.comp.Resolve.isAccessible(Resolve.java:402)
at com.sun.tools.javac.comp.Resolve.isAccessible(Resolve.java:362)
at com.sun.tools.javac.comp.Resolve.selectBest(Resolve.java:1448)
at com.sun.tools.javac.comp.Resolve.findMethodInScope(Resolve.java:1618)
at com.sun.tools.javac.comp.Resolve.findMethod(Resolve.java:1689)
at com.sun.tools.javac.comp.Resolve.findMethod(Resolve.java:1662)
at com.sun.tools.javac.comp.DeferredAttr$DeferredChecker$2.lookup(DeferredAttr.java:1325)
at com.sun.tools.javac.comp.Resolve.lookupMethod(Resolve.java:3325)
at com.sun.tools.javac.comp.Resolve.lookupMethod(Resolve.java:3310)
at com.sun.tools.javac.comp.DeferredAttr$DeferredChecker.quicklyResolveMethod(DeferredAttr.java:1333)
at com.sun.tools.javac.comp.DeferredAttr$DeferredChecker.visitApply(DeferredAttr.java:1223)
at com.sun.tools.javac.tree.JCTree$JCMethodInvocation.accept(JCTree.java:1465)
at com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:49)
at com.sun.tools.javac.comp.DeferredAttr$FilterScanner.scan(DeferredAttr.java:901)
at com.sun.tools.javac.comp.DeferredAttr.isDeferred(DeferredAttr.java:1088)
at com.sun.tools.javac.comp.Attr.attribArgs(Attr.java:701)
at com.sun.tools.javac.comp.Attr.visitApply(Attr.java:1834)
at com.sun.tools.javac.tree.JCTree$JCMethodInvocation.accept(JCTree.java:1465)
at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:607)
at com.sun.tools.javac.comp.Attr.attribExpr(Attr.java:656)
at com.sun.tools.javac.comp.Attr.visitExec(Attr.java:1611)
at com.sun.tools.javac.tree.JCTree$JCExpressionStatement.accept(JCTree.java:1296)
at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:607)
at com.sun.tools.javac.comp.Attr.attribStat(Attr.java:676)
at com.sun.tools.javac.comp.Attr.visitForeachLoop(Attr.java:1207)
at com.sun.tools.javac.tree.JCTree$JCEnhancedForLoop.accept(JCTree.java:1035)
at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:607)
at com.sun.tools.javac.comp.Attr.attribStat(Attr.java:676)
at com.sun.tools.javac.comp.Attr.attribStats(Attr.java:692)
at com.sun.tools.javac.comp.Attr.visitBlock(Attr.java:1142)
at com.sun.tools.javac.tree.JCTree$JCBlock.accept(JCTree.java:909)
at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:607)
at com.sun.tools.javac.comp.Attr.attribStat(Attr.java:676)
at com.sun.tools.javac.comp.Attr.visitMethodDef(Attr.java:1035)
at com.sun.tools.javac.tree.JCTree$JCMethodDecl.accept(JCTree.java:778)
at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:607)
at com.sun.tools.javac.comp.Attr.attribStat(Attr.java:676)
at com.sun.tools.javac.comp.Attr.attribClassBody(Attr.java:4342)
at com.sun.tools.javac.comp.Attr.attribClass(Attr.java:4252)
at com.sun.tools.javac.comp.Attr.attribClass(Attr.java:4181)
at com.sun.tools.javac.comp.Attr.attrib(Attr.java:4156)
at com.sun.tools.javac.main.JavaCompiler.attribute(JavaCompiler.java:1248)
at com.sun.tools.javac.main.JavaCompiler.compile2(JavaCompiler.java:901)
at com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:860)
at com.sun.tools.javac.main.Main.compile(Main.java:523)
at com.sun.tools.javac.main.Main.compile(Main.java:381)
at com.sun.tools.javac.main.Main.compile(Main.java:370)
at com.sun.tools.javac.main.Main.compile(Main.java:361)
at com.sun.tools.javac.Main.compile(Main.java:56)
at com.sun.tools.javac.Main.main(Main.java:42)
REPRODUCIBILITY :
This bug can be reproduced always.
---------- BEGIN SOURCE ----------
import java.util.Map;
public interface Ident {
public String getId();
public static String getId(Ident i) { return i!=null ? i.getId() : null; }
public static <E extends Ident> Map<String,E> put(Map<String,E> store, Iterable<? extends E> objects) {
for(E i : objects) store.put(i.getId(), i);
return store;
}
}
---------- END SOURCE ----------
CUSTOMER SUBMITTED WORKAROUND :
It seems that changing
public static String getId(Ident i) { return i!=null ? i.getId() : null; }
with
public static String getOtherMethodName(Ident i) { return i!=null ? i.getId() : null; }
fixes the problem