Reputation: 25176
Code (spring-web 5.1.2)
public static void main(String[] args) {
RestTemplate restTemplate = new RestTemplate();
HttpHeaders headers = new HttpHeaders();
headers.set(HttpHeaders.AUTHORIZATION, "token");
HttpEntity<Object> requestEntity = new HttpEntity<>(headers);
ResponseEntity<Object> test = restTemplate.exchange(
"https://example.com",
HttpMethod.GET,
new HttpEntity<>(headers),
new ParameterizedTypeReference<>() { // fails here
});
}
OracleJDK 1.8 (expected output)
cannot infer type arguments for org.springframework.core.ParameterizedTypeReference
reason: cannot use '<>' with anonymous inner classes
OracleJDK 11.0.2 (not expected output)
compiler message file broken: key=compiler.misc.msg.bug arguments=11.0.2, {1}, {2}, {3}, {4}, {5}, {6}, {7} java.lang.NullPointerException at jdk.compiler/com.sun.tools.javac.comp.Flow$FlowAnalyzer.visitApply(Flow.java:1235) at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCMethodInvocation.accept(JCTree.java:1634) at jdk.compiler/com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:49) at jdk.compiler/com.sun.tools.javac.comp.Flow$BaseAnalyzer.scan(Flow.java:398) at jdk.compiler/com.sun.tools.javac.comp.Flow$FlowAnalyzer.visitVarDef(Flow.java:989)
...
If I change diamond operator to explicit type
new ParameterizedTypeReference<>(){}
to new ParameterizedTypeReference<Object>(){}
then the code compiles successfully on both JDKs.
Is it a known compiler bug?
Upvotes: 75
Views: 46347
Reputation: 1416
In my case I intalled latest java 11 from oracle (Java SE Development Kit 11.0.19) and it solved problem. You can download latest version here : https://www.oracle.com/pl/java/technologies/javase/jdk11-archive-downloads.html
Upvotes: 0
Reputation: 61
In case anyone else faces this issue: we had to change the java compiler from javac to eclipse (anything else that's not javac) to get our code to compile. Upgrading/downgrading jdk didn't fix the issue for us.
Upvotes: 0
Reputation: 669
Most of the times, this error doesn't tell you the originating class so it's very hard to intentionally reproduce the problem. After trying a lot, I finally updated project JDK to 11.0.16 (from 11.0.7) and it worked!
Upvotes: 0
Reputation: 208
I've fixed this problem on my machine by upgrading to AdoptOpenJDK 11.0.8.
https://adoptopenjdk.net/installation.html#x64_mac-jdk
Upvotes: 2
Reputation: 105
As pointed out in previous comments, the problem is with parametrized anonymous classes, e.g. when using TypeToken from Guava, this does NOT work:
public List<SomeClass> list() {
return getData(new TypeToken<>() { });
}
But this DOES work:
public List<SomeClass> list() {
return getData(new TypeToken<List<SomeClass>>() { });
}
I tried that in versions 11.0.3 - 11.0.7 versions and all contains the bug.
Upvotes: 10
Reputation: 51
Java 11.0.7 has the same problem.
This changed from:
new ParameterizedTypeReference<>() {
})
to this:
new ParameterizedTypeReference<HashMap<String, MyClass>>() {
})
Upvotes: 5
Reputation: 91
I Had the same error,you need to create a function :
ParameterizedTypeReference<Object> createParameterizedTypeReference(){ return new ParameterizedTypeReference<>(){}; }
and call it :
ResponseEntity<Object> test = restTemplate.exchange(
"https://example.com",
HttpMethod.GET,
new HttpEntity<>(headers),
createParameterizedTypeReference() {
});
Upvotes: 9
Reputation: 25176
Bug (JDK-8212586) has been already submitted and fixed in version 12.
Minimal, verifiable example:
public static void main(String[] args) {
new Bug<>(){};
}
static class Bug<T> {
Bug() {
test(new ParameterizedTypeReference<>(){});
}
void test(ParameterizedTypeReference<T> typeReference) {
}
}
Fix has been also backported to JDK 11 - https://bugs.openjdk.java.net/browse/JDK-8220578.
Available starting JDK 11.0.4.
Upvotes: 66