从Java 7迁移到Java 8 - 编译错误

时间:2016-02-05 09:56:53

标签: java java-8 java-7

以下代码在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();
} 

1 个答案:

答案 0 :(得分:5)

以上编译是因为它使用的是rawTypes。

最底层的方法不是因为您的方法只接受Class<T>,但您给了它Class。使用反射,您不能指定类的泛型类型,因此getObject将返回原始的Class对象。

问题的唯一解决方法是转换返回结果。

method((Class<?>)getObject(Class.class));

但是,虽然此解决方案解决了运行时问题,但您仍然无法创建Class的新实例。

JDK 7在此比较中不那么严格,并且在后台将返回结果Class转换为Class<?>,因此允许编译代码。

根据Holger JDK 7关闭整行的泛型类型,并使用原始类型作为返回结果,这意味着该方法获得Class并返回ResponseEntity。< / p>