从Java 7迁移到Java 8 – 编译错误
发布时间:2020-12-15 00:40:21 所属栏目:Java 来源:网络整理
导读:以下代码在JDK7中使用 javac编译两种测试方法,但JDK8只编译willCompile方法. willNotcompile的错误是: “Klasa类型中的方法方法(Class T)不适用于参数(Class).” @Testpublic void willCompile() throws InstantiationException,IllegalAccessException { C
以下代码在JDK7中使用
javac编译两种测试方法,但JDK8只编译willCompile方法.
willNotcompile的错误是: @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.使用反射,您不能指定类的泛型类型,因此getObject将返回原始的Class对象. 解决问题的唯一方法是转换返回结果. method((Class<?>)getObject(Class.class)); 但是,虽然此解决方案解决了运行时问题,但您仍然无法创建新的Class实例. JDK 7在此比较中不那么严格,并将返回结果Class转换为Class<?>.在幕后所以代码被允许编译. 根据Holger JDK 7关闭整行的泛型类型,并使用原始类型作为返回结果,这意味着该方法获取一个Class并返回一个ResponseEntity. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |