-
Bug
-
Resolution: Duplicate
-
P3
-
None
-
11
A DESCRIPTION OF THE PROBLEM :
The code example compiles fine with java8 and java13+, but fails with java11 (LTS). It also fails with the latest 11.0.7.
REGRESSION : Last worked in version 8u241
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
Prepare a directory "example" containing the three java source files listed below. Then run:
javac example/Example.java example/Mapper.java
EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
javac should compile the code.
ACTUAL -
javac gave the error output below:
An exception has occurred in the compiler (11.0.7). Please file a bug against the Java compiler via the Java bug reporting page (http://bugreport.java.com) after checking the Bug Database (http://bugs.java.com) for duplicates. Include your program and the following diagnostic in your report. Thank you.
java.lang.NullPointerException
at jdk.compiler/com.sun.tools.javac.code.Types.erasure(Types.java:2340)
at jdk.compiler/com.sun.tools.javac.code.Types$14.visitTypeVar(Types.java:2398)
at jdk.compiler/com.sun.tools.javac.code.Types$14.visitTypeVar(Types.java:2348)
at jdk.compiler/com.sun.tools.javac.code.Type$TypeVar.accept(Type.java:1654)
at jdk.compiler/com.sun.tools.javac.code.Types$DefaultTypeVisitor.visit(Types.java:4857)
at jdk.compiler/com.sun.tools.javac.code.Type$StructuralTypeMapping.visitMethodType(Type.java:282)
at jdk.compiler/com.sun.tools.javac.code.Type$StructuralTypeMapping.visitMethodType(Type.java:230)
at jdk.compiler/com.sun.tools.javac.code.Type$MethodType.accept(Type.java:1448)
at jdk.compiler/com.sun.tools.javac.code.Types$DefaultTypeVisitor.visit(Types.java:4857)
at jdk.compiler/com.sun.tools.javac.code.Types.erasure(Types.java:2343)
at jdk.compiler/com.sun.tools.javac.code.Types.erasure(Types.java:2329)
at jdk.compiler/com.sun.tools.javac.code.Types.isSubSignature(Types.java:2748)
at jdk.compiler/com.sun.tools.javac.code.Types.isSubSignature(Types.java:2744)
at jdk.compiler/com.sun.tools.javac.code.Symbol$MethodSymbol.overrides(Symbol.java:1820)
at jdk.compiler/com.sun.tools.javac.code.Symbol$MethodSymbol.overrides(Symbol.java:1792)
at jdk.compiler/com.sun.tools.javac.code.Types$ImplementationCache.implementationInternal(Types.java:2932)
at jdk.compiler/com.sun.tools.javac.code.Types$ImplementationCache.get(Types.java:2917)
at jdk.compiler/com.sun.tools.javac.code.Types.implementation(Types.java:2952)
at jdk.compiler/com.sun.tools.javac.code.Symbol$MethodSymbol.implementation(Symbol.java:1892)
at jdk.compiler/com.sun.tools.javac.code.Symbol$MethodSymbol.implementation(Symbol.java:1885)
at jdk.compiler/com.sun.tools.javac.comp.Resolve.notOverriddenIn(Resolve.java:455)
at jdk.compiler/com.sun.tools.javac.comp.Resolve.selectBest(Resolve.java:1553)
at jdk.compiler/com.sun.tools.javac.comp.Resolve.findMethodInScope(Resolve.java:1733)
at jdk.compiler/com.sun.tools.javac.comp.Resolve.findMethod(Resolve.java:1823)
at jdk.compiler/com.sun.tools.javac.comp.Resolve.findMethod(Resolve.java:1776)
at jdk.compiler/com.sun.tools.javac.comp.Resolve$10.doLookup(Resolve.java:2654)
at jdk.compiler/com.sun.tools.javac.comp.Resolve$BasicLookupHelper.lookup(Resolve.java:3293)
at jdk.compiler/com.sun.tools.javac.comp.Resolve.lookupMethod(Resolve.java:3543)
at jdk.compiler/com.sun.tools.javac.comp.Resolve.resolveQualifiedMethod(Resolve.java:2651)
at jdk.compiler/com.sun.tools.javac.comp.Resolve.resolveQualifiedMethod(Resolve.java:2645)
at jdk.compiler/com.sun.tools.javac.comp.Attr.selectSym(Attr.java:3721)
at jdk.compiler/com.sun.tools.javac.comp.Attr.visitSelect(Attr.java:3601)
at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCFieldAccess.accept(JCTree.java:2114)
at jdk.compiler/com.sun.tools.javac.comp.Attr.attribTree(Attr.java:655)
at jdk.compiler/com.sun.tools.javac.comp.Attr.visitApply(Attr.java:2006)
at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCMethodInvocation.accept(JCTree.java:1634)
at jdk.compiler/com.sun.tools.javac.comp.Attr.attribTree(Attr.java:655)
at jdk.compiler/com.sun.tools.javac.comp.Attr.attribExpr(Attr.java:695)
at jdk.compiler/com.sun.tools.javac.comp.Attr.visitVarDef(Attr.java:1174)
at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCVariableDecl.accept(JCTree.java:956)
at jdk.compiler/com.sun.tools.javac.comp.Attr.attribTree(Attr.java:655)
at jdk.compiler/com.sun.tools.javac.comp.Attr.attribStat(Attr.java:724)
at jdk.compiler/com.sun.tools.javac.comp.Attr.attribStats(Attr.java:743)
at jdk.compiler/com.sun.tools.javac.comp.Attr.visitBlock(Attr.java:1294)
at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCBlock.accept(JCTree.java:1020)
at jdk.compiler/com.sun.tools.javac.comp.Attr.attribTree(Attr.java:655)
at jdk.compiler/com.sun.tools.javac.comp.Attr.attribStat(Attr.java:724)
at jdk.compiler/com.sun.tools.javac.comp.Attr.visitMethodDef(Attr.java:1098)
at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCMethodDecl.accept(JCTree.java:866)
at jdk.compiler/com.sun.tools.javac.comp.Attr.attribTree(Attr.java:655)
at jdk.compiler/com.sun.tools.javac.comp.Attr.attribStat(Attr.java:724)
at jdk.compiler/com.sun.tools.javac.comp.Attr.attribClassBody(Attr.java:4683)
at jdk.compiler/com.sun.tools.javac.comp.Attr.attribClass(Attr.java:4574)
at jdk.compiler/com.sun.tools.javac.comp.Attr.attribClass(Attr.java:4503)
at jdk.compiler/com.sun.tools.javac.comp.Attr.attrib(Attr.java:4448)
at jdk.compiler/com.sun.tools.javac.main.JavaCompiler.attribute(JavaCompiler.java:1341)
at jdk.compiler/com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:973)
at jdk.compiler/com.sun.tools.javac.main.Main.compile(Main.java:311)
at jdk.compiler/com.sun.tools.javac.main.Main.compile(Main.java:170)
at jdk.compiler/com.sun.tools.javac.Main.compile(Main.java:57)
at jdk.compiler/com.sun.tools.javac.Main.main(Main.java:43)
---------- BEGIN SOURCE ----------
-----
example/Exampe.java:
package example;
public class Example {
<T extends Number> T doSomething(final Number n, final Mapper<? super Number, ? extends T> mapper) {
final T t = mapper.apply(n);
return t;
}
}
-----
example/Mapper.java:
package example;
import java.util.Collections;
import java.util.Iterator;
import java.util.Objects;
import java.util.function.Function;
import java.util.function.Predicate;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@FunctionalInterface
interface Mapper<I, O> extends Function<I, @Nullable O> {
@Override
O apply(I i);
static <T> Iterator<T> apply(Iterator<? extends T> iter, int count) {
return Collections.emptyIterator();
}
}
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE_USE, ElementType.TYPE_PARAMETER})
@interface Nullable {
}
-----
---------- END SOURCE ----------
CUSTOMER SUBMITTED WORKAROUND :
* The order of the files matter. If Mapper.java is given first to javac, then the problem doesn't appear.
* Remove the annotation "@Nullable" for the type param "O" in Mapper.java
* Rename the 2nd "apply" method, so that it doesn't overload Function::apply anymore.
FREQUENCY : always
The code example compiles fine with java8 and java13+, but fails with java11 (LTS). It also fails with the latest 11.0.7.
REGRESSION : Last worked in version 8u241
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
Prepare a directory "example" containing the three java source files listed below. Then run:
javac example/Example.java example/Mapper.java
EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
javac should compile the code.
ACTUAL -
javac gave the error output below:
An exception has occurred in the compiler (11.0.7). Please file a bug against the Java compiler via the Java bug reporting page (http://bugreport.java.com) after checking the Bug Database (http://bugs.java.com) for duplicates. Include your program and the following diagnostic in your report. Thank you.
java.lang.NullPointerException
at jdk.compiler/com.sun.tools.javac.code.Types.erasure(Types.java:2340)
at jdk.compiler/com.sun.tools.javac.code.Types$14.visitTypeVar(Types.java:2398)
at jdk.compiler/com.sun.tools.javac.code.Types$14.visitTypeVar(Types.java:2348)
at jdk.compiler/com.sun.tools.javac.code.Type$TypeVar.accept(Type.java:1654)
at jdk.compiler/com.sun.tools.javac.code.Types$DefaultTypeVisitor.visit(Types.java:4857)
at jdk.compiler/com.sun.tools.javac.code.Type$StructuralTypeMapping.visitMethodType(Type.java:282)
at jdk.compiler/com.sun.tools.javac.code.Type$StructuralTypeMapping.visitMethodType(Type.java:230)
at jdk.compiler/com.sun.tools.javac.code.Type$MethodType.accept(Type.java:1448)
at jdk.compiler/com.sun.tools.javac.code.Types$DefaultTypeVisitor.visit(Types.java:4857)
at jdk.compiler/com.sun.tools.javac.code.Types.erasure(Types.java:2343)
at jdk.compiler/com.sun.tools.javac.code.Types.erasure(Types.java:2329)
at jdk.compiler/com.sun.tools.javac.code.Types.isSubSignature(Types.java:2748)
at jdk.compiler/com.sun.tools.javac.code.Types.isSubSignature(Types.java:2744)
at jdk.compiler/com.sun.tools.javac.code.Symbol$MethodSymbol.overrides(Symbol.java:1820)
at jdk.compiler/com.sun.tools.javac.code.Symbol$MethodSymbol.overrides(Symbol.java:1792)
at jdk.compiler/com.sun.tools.javac.code.Types$ImplementationCache.implementationInternal(Types.java:2932)
at jdk.compiler/com.sun.tools.javac.code.Types$ImplementationCache.get(Types.java:2917)
at jdk.compiler/com.sun.tools.javac.code.Types.implementation(Types.java:2952)
at jdk.compiler/com.sun.tools.javac.code.Symbol$MethodSymbol.implementation(Symbol.java:1892)
at jdk.compiler/com.sun.tools.javac.code.Symbol$MethodSymbol.implementation(Symbol.java:1885)
at jdk.compiler/com.sun.tools.javac.comp.Resolve.notOverriddenIn(Resolve.java:455)
at jdk.compiler/com.sun.tools.javac.comp.Resolve.selectBest(Resolve.java:1553)
at jdk.compiler/com.sun.tools.javac.comp.Resolve.findMethodInScope(Resolve.java:1733)
at jdk.compiler/com.sun.tools.javac.comp.Resolve.findMethod(Resolve.java:1823)
at jdk.compiler/com.sun.tools.javac.comp.Resolve.findMethod(Resolve.java:1776)
at jdk.compiler/com.sun.tools.javac.comp.Resolve$10.doLookup(Resolve.java:2654)
at jdk.compiler/com.sun.tools.javac.comp.Resolve$BasicLookupHelper.lookup(Resolve.java:3293)
at jdk.compiler/com.sun.tools.javac.comp.Resolve.lookupMethod(Resolve.java:3543)
at jdk.compiler/com.sun.tools.javac.comp.Resolve.resolveQualifiedMethod(Resolve.java:2651)
at jdk.compiler/com.sun.tools.javac.comp.Resolve.resolveQualifiedMethod(Resolve.java:2645)
at jdk.compiler/com.sun.tools.javac.comp.Attr.selectSym(Attr.java:3721)
at jdk.compiler/com.sun.tools.javac.comp.Attr.visitSelect(Attr.java:3601)
at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCFieldAccess.accept(JCTree.java:2114)
at jdk.compiler/com.sun.tools.javac.comp.Attr.attribTree(Attr.java:655)
at jdk.compiler/com.sun.tools.javac.comp.Attr.visitApply(Attr.java:2006)
at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCMethodInvocation.accept(JCTree.java:1634)
at jdk.compiler/com.sun.tools.javac.comp.Attr.attribTree(Attr.java:655)
at jdk.compiler/com.sun.tools.javac.comp.Attr.attribExpr(Attr.java:695)
at jdk.compiler/com.sun.tools.javac.comp.Attr.visitVarDef(Attr.java:1174)
at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCVariableDecl.accept(JCTree.java:956)
at jdk.compiler/com.sun.tools.javac.comp.Attr.attribTree(Attr.java:655)
at jdk.compiler/com.sun.tools.javac.comp.Attr.attribStat(Attr.java:724)
at jdk.compiler/com.sun.tools.javac.comp.Attr.attribStats(Attr.java:743)
at jdk.compiler/com.sun.tools.javac.comp.Attr.visitBlock(Attr.java:1294)
at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCBlock.accept(JCTree.java:1020)
at jdk.compiler/com.sun.tools.javac.comp.Attr.attribTree(Attr.java:655)
at jdk.compiler/com.sun.tools.javac.comp.Attr.attribStat(Attr.java:724)
at jdk.compiler/com.sun.tools.javac.comp.Attr.visitMethodDef(Attr.java:1098)
at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCMethodDecl.accept(JCTree.java:866)
at jdk.compiler/com.sun.tools.javac.comp.Attr.attribTree(Attr.java:655)
at jdk.compiler/com.sun.tools.javac.comp.Attr.attribStat(Attr.java:724)
at jdk.compiler/com.sun.tools.javac.comp.Attr.attribClassBody(Attr.java:4683)
at jdk.compiler/com.sun.tools.javac.comp.Attr.attribClass(Attr.java:4574)
at jdk.compiler/com.sun.tools.javac.comp.Attr.attribClass(Attr.java:4503)
at jdk.compiler/com.sun.tools.javac.comp.Attr.attrib(Attr.java:4448)
at jdk.compiler/com.sun.tools.javac.main.JavaCompiler.attribute(JavaCompiler.java:1341)
at jdk.compiler/com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:973)
at jdk.compiler/com.sun.tools.javac.main.Main.compile(Main.java:311)
at jdk.compiler/com.sun.tools.javac.main.Main.compile(Main.java:170)
at jdk.compiler/com.sun.tools.javac.Main.compile(Main.java:57)
at jdk.compiler/com.sun.tools.javac.Main.main(Main.java:43)
---------- BEGIN SOURCE ----------
-----
example/Exampe.java:
package example;
public class Example {
<T extends Number> T doSomething(final Number n, final Mapper<? super Number, ? extends T> mapper) {
final T t = mapper.apply(n);
return t;
}
}
-----
example/Mapper.java:
package example;
import java.util.Collections;
import java.util.Iterator;
import java.util.Objects;
import java.util.function.Function;
import java.util.function.Predicate;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@FunctionalInterface
interface Mapper<I, O> extends Function<I, @Nullable O> {
@Override
O apply(I i);
static <T> Iterator<T> apply(Iterator<? extends T> iter, int count) {
return Collections.emptyIterator();
}
}
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE_USE, ElementType.TYPE_PARAMETER})
@interface Nullable {
}
-----
---------- END SOURCE ----------
CUSTOMER SUBMITTED WORKAROUND :
* The order of the files matter. If Mapper.java is given first to javac, then the problem doesn't appear.
* Remove the annotation "@Nullable" for the type param "O" in Mapper.java
* Rename the 2nd "apply" method, so that it doesn't overload Function::apply anymore.
FREQUENCY : always
- duplicates
-
JDK-8193367 annotated type variables bounds crash javac
- Resolved
- relates to
-
JDK-8193367 annotated type variables bounds crash javac
- Resolved
-
JDK-8248014 annotated type variables bounds crash javac
- Resolved