Переход с Java 7 на Java 8 - ошибка компиляции

следующий код компилирует оба метода тестирования с помощью javac в JDK7, но JDK8 будет компилироваться только willCompile метод.

ошибка willNotcompile is: - Метод! .. --3-->(Class<T>) в виде Klasa не применяется для Аргументов (Class)."

@Test
public void willCompile() throws InstantiationException, IllegalAccessException {
    Class klass = getObject(Class.class);
    method(klass);
}

@Test
public void willNotCompile() throws InstantiationException, IllegalAccessException {
    method(getObject(Class.class));
}

<T> ResponseEntity<T> method (Class<T> klasa) {
    return new ResponseEntity<T>(HttpStatus.OK);
}
public static <T> T getObject(Class<T> clazz) throws IllegalAccessException, InstantiationException {
    return clazz.newInstance();
} 

1 ответов


выше компилируется, потому что он использует rawTypes.

нижний не делает, потому что ваш метод принимает только Class<T>, а ты Class. Используя отражение, вы не можете указать общие типы класса, поэтому getObject вернет объект необработанного класса.

единственным исправлением проблемы является приведение результата возврата.

method((Class<?>)getObject(Class.class));

но пока это решение решает проблему времени выполнения, вы все равно получаете проблемы с тем, что вы не можете создавать новые экземпляры Class.

JDK 7 был менее строгим в этом сравнении и отлил возвращаемый результат Class на Class<?> за кулисами, чтобы код был разрешен для компиляции.

по данным Хольгер JDK 7 отключает типы дженериков для всех строк и использует необработанные типы для возвращаемого результата, что означает, что метод получает Class и возвращает ResponseEntity.