Сбой компиляции JDK 11.0.2 с javac NPE при выводе анонимного параметризованного класса - PullRequest
0 голосов
/ 20 февраля 2019

Код (весна-сеть 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 (ожидаемый результат)

не может вывестиаргументы типа для org.springframework.core.ParameterizedTypeReference

причина: нельзя использовать «<>» с анонимными внутренними классами

OracleJDK 11.0.2 (не ожидаетсявыходные данные)

файл сообщения компилятора поврежден: ключ = compiler.misc.msg.bug arguments = 11.0.2, {1}, {2}, {3}, {4}, {5}, {6}, {7} java.lang.NullPointerException в jdk.compiler / com.sun.tools.javac.comp.Flow $ FlowAnalyzer.visitApply (Flow.java:1235) в jdk.compiler / com.sun.tools.javac.tree..tools.javac.comp.Flow $ BaseAnalyzer.scan (Flow.java:398) в jdk.compiler / com.sun.tools.javac.comp.Flow $ FlowAnalyzer.visitVarDef (Flow.java:989)...

Если я поменяю оператор diamond на явный тип

new ParameterizedTypeReference<>(){} на new ParameterizedTypeReference<Object>(){}

, тогда код успешно компилируется в обоих JDK.

Это известная ошибка компилятора?

Ответы [ 2 ]

0 голосов
/ 25 июня 2019

У меня была та же ошибка, вам нужно создать функцию:

ParameterizedTypeReference(Object) createParameterizedTypeReference(){ return new ParameterizedTypeReference<>(); }

и вызвать ее:

ResponseEntity<Object> test = restTemplate.exchange(
"https://example.com",
HttpMethod.GET,
new HttpEntity<>(headers),
createParameterizedTypeReference() { 
});
0 голосов
/ 20 февраля 2019

Ошибка ( JDK-8212586 ) уже отправлена ​​и исправлена ​​ в версии 12.

Минимальный проверяемый пример:

public static void main(String[] args) {
    new Bug<>(){};
}

static class Bug<T> {

    Bug() {
        test(new ParameterizedTypeReference<>(){});
    }

    void test(ParameterizedTypeReference<T> typeReference) {
    }
}

Некоторые детали.


Исправление также перенесено в JDK 11 - https://bugs.openjdk.java.net/browse/JDK-8220578.

Доступно начиная с JDK 11.0.4 .

...