use*_*192 7 java java-7 java-8
以下代码在JDK7中使用javac编译两种测试方法,但JDK8只编译willCompile方法.
错误willNotcompile是:"类型中的方法method(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();
}
Run Code Online (Sandbox Code Playgroud)
以上编译是因为它使用的是rawTypes.
最底层的不是因为你的方法只接受a Class<T>,但你给了它一个Class.使用反射,您不能指定类的泛型类型,因此getObject将返回原始的Class对象.
解决问题的唯一方法是转换返回结果.
method((Class<?>)getObject(Class.class));
Run Code Online (Sandbox Code Playgroud)
但是,虽然此解决方案解决了运行时问题,但您仍然无法创建无法创建新实例的问题Class.
JDK 7在此比较中不那么严格,并将返回结果Class转换为Class<?>幕后,因此允许编译代码.
根据Holger, JDK 7关闭整行的泛型类型,并使用原始类型作为返回结果,这意味着该方法得到一个Class并返回一个ResponseEntity.