从 Java 7 迁移到 Java 8 - 编译错误
Migrating from Java 7 to Java 8 - compilation error
以下代码在 JDK7 中使用 javac 编译两个测试方法,但 JDK8 只会编译 willCompile
方法。
willNotcompile
的错误是:
"The method method
(Class<T>
) in the type Klasa
is not applicable for the arguments (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();
}
上面的编译是因为它使用了 rawTypes。
底部的不是因为你的方法只接受 Class<T>
,但你给了它 Class
。使用反射,您无法指定 class 的泛型类型,因此 getObject
将 return 原始 Class 对象。
问题的唯一解决方法是转换 return 结果。
method((Class<?>)getObject(Class.class));
但是,尽管此解决方案解决了运行时问题,但您仍然无法创建 Class
的新实例。
JDK 7 在这个比较中不太严格,并且在幕后将 return 结果 Class
转换为 Class<?>
因此代码是允许编译。
根据 Holger JDK 7 关闭整行的泛型类型,并使用原始类型作为 return 结果,这意味着该方法得到 Class
并且 return 是一个 ResponseEntity
.
以下代码在 JDK7 中使用 javac 编译两个测试方法,但 JDK8 只会编译 willCompile
方法。
willNotcompile
的错误是:
"The method method
(Class<T>
) in the type Klasa
is not applicable for the arguments (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();
}
上面的编译是因为它使用了 rawTypes。
底部的不是因为你的方法只接受 Class<T>
,但你给了它 Class
。使用反射,您无法指定 class 的泛型类型,因此 getObject
将 return 原始 Class 对象。
问题的唯一解决方法是转换 return 结果。
method((Class<?>)getObject(Class.class));
但是,尽管此解决方案解决了运行时问题,但您仍然无法创建 Class
的新实例。
JDK 7 在这个比较中不太严格,并且在幕后将 return 结果 Class
转换为 Class<?>
因此代码是允许编译。
根据 Holger JDK 7 关闭整行的泛型类型,并使用原始类型作为 return 结果,这意味着该方法得到 Class
并且 return 是一个 ResponseEntity
.