Переход с 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.