JDK 11.0.2-Kompilierung schlägt mit javac NPE bei anonymer parametrisierter Klassentyp-Inferenz fehl
Lesezeit: 3 Minuten
Michail Cholodkow
Code (Springweb 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 (erwartete Ausgabe)
kann keine Typargumente für org.springframework.core.ParameterizedTypeReference ableiten
Grund: ‘<>‘ kann nicht mit anonymen inneren Klassen verwendet werden
OracleJDK 11.0.2 (nicht erwartete Ausgabe)
Compiler-Meldungsdatei defekt: key=compiler.misc.msg.bug arguments=11.0.2, {1}, {2}, {3}, {4}, {5}, {6}, {7} java.lang .NullPointerException bei jdk.compiler/com.sun.tools.javac.comp.Flow$FlowAnalyzer.visitApply(Flow.java:1235) bei jdk.compiler/com.sun.tools.javac.tree.JCTree$JCMethodInvocation.accept( JCTree.java:1634) unter jdk.compiler/com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:49) unter jdk.compiler/com.sun.tools.javac.comp.Flow$BaseAnalyzer. scan(Flow.java:398) unter jdk.compiler/com.sun.tools.javac.comp.Flow$FlowAnalyzer.visitVarDef(Flow.java:989)
…
Wenn ich den Rautenoperator in den expliziten Typ ändere
new ParameterizedTypeReference<>(){} zu new ParameterizedTypeReference<Object>(){}
dann wird der Code auf beiden JDKs erfolgreich kompiliert.
Ist es ein bekannter Compiler-Bug?
Eine Ausnahme vom Compiler ist ein Fehler. Schreiben Sie einen Testfall und reichen Sie den Fehler ein.
– Thorbjørn Ravn Andersen
19. Februar 2019 um 22:07 Uhr
Auch diesen Fehler bestätige ich
– Mircea Stanciu
25. März 2019 um 20:43 Uhr
Ich kann das Projekt nicht erstellen, während meine anderen Teamkollegen es erstellen können. Ich habe versucht, mein Repo zu löschen. kein Glück .
– Robert Ravikumar
16. November 2020 um 2:03 Uhr
Dies ist ein Fehler in allen Versionen, die älter als 11.0.8 sind. Versuchen Sie, Ihr JDK auf 11.0.8 oder neuer zu aktualisieren
– Callum Atwal
27. Januar um 14:53 Uhr
JDK 11.0.14 funktioniert, habe frühere Versionen nicht ausprobiert.
– gaborsch
28. April um 15:14 Uhr
Michail Cholodkow
Insekt (JDK-8212586) wurde bereits eingereicht und Fest in Version 12.
Minimales, überprüfbares Beispiel:
public static void main(String[] args) {
new Bug<>(){};
}
static class Bug<T> {
Bug() {
test(new ParameterizedTypeReference<>(){});
}
void test(ParameterizedTypeReference<T> typeReference) {
}
}
@ MirceaStanciu Fix wurde zurückportiert und wird in JDK 11.0.4 verfügbar sein. Antwort aktualisiert.
– Michail Cholodkow
25. März 2019 um 22:43 Uhr
Java 11.0.6 hat das gleiche Problem
– Maxim Kasjanow
29. Juni 2020 um 12:21 Uhr
Otmane el alami el hassani
Ich hatte den gleichen Fehler, Sie müssen eine Funktion erstellen:
ParameterizedTypeReference<Object> createParameterizedTypeReference(){ return new ParameterizedTypeReference<>(){}; }
und nenne es:
ResponseEntity<Object> test = restTemplate.exchange(
"https://example.com",
HttpMethod.GET,
new HttpEntity<>(headers),
createParameterizedTypeReference() {
});
Wie in früheren Kommentaren erwähnt, besteht das Problem bei parametrisierten anonymen Klassen, z. B. bei der Verwendung von TypeToken von Guava NICHT Arbeit:
public List<SomeClass> list() {
return getData(new TypeToken<>() { });
}
Aber dieses TUT Arbeit:
public List<SomeClass> list() {
return getData(new TypeToken<List<SomeClass>>() { });
}
Ich habe das in den Versionen 11.0.3 – 11.0.7 versucht und alle enthalten den Fehler.
OpenJDK 11.0.8 hat den Fehler auch
– aksh1618
5. Januar 2021 um 14:47 Uhr
Martin Langvatn
Java 11.0.7 hat das gleiche Problem.
Dies änderte sich von:
new ParameterizedTypeReference<>() {
})
dazu:
new ParameterizedTypeReference<HashMap<String, MyClass>>() {
})
Ich habe dieses Problem auf meinem Computer behoben, indem ich auf AdoptOpenJDK 11.0.8 aktualisiert habe.
Eine Ausnahme vom Compiler ist ein Fehler. Schreiben Sie einen Testfall und reichen Sie den Fehler ein.
– Thorbjørn Ravn Andersen
19. Februar 2019 um 22:07 Uhr
Auch diesen Fehler bestätige ich
– Mircea Stanciu
25. März 2019 um 20:43 Uhr
Ich kann das Projekt nicht erstellen, während meine anderen Teamkollegen es erstellen können. Ich habe versucht, mein Repo zu löschen. kein Glück .
– Robert Ravikumar
16. November 2020 um 2:03 Uhr
Dies ist ein Fehler in allen Versionen, die älter als 11.0.8 sind. Versuchen Sie, Ihr JDK auf 11.0.8 oder neuer zu aktualisieren
– Callum Atwal
27. Januar um 14:53 Uhr
JDK 11.0.14 funktioniert, habe frühere Versionen nicht ausprobiert.
– gaborsch
28. April um 15:14 Uhr