从 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.