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