泛型中的通配符在Java 7和8中表现不同
我有这个编译为
Java 7(
Eclipse编译器)时编译好的代码,但是当我将项目设置设置为Java 8时失败:
package scratch; class Param<T extends Comparable<T>> { public Comparable<?> get() { return null; } } public class Condition<T extends Comparable<T>> { public static <T extends Comparable<T>> Condition<T> isInRange(T lower,T upper) { return null; } public void foo() { Comparable bound = null; // Line 15 Param<?> param = new Param<Double>(); Condition.isInRange(param.get(),bound); // Line 17 } } 在Java 7中,我收到以下警告: >第15行:可比较是原始类型.应参数化对泛型类型Comparable的引用 当我添加<?>在第15行,警告消失了,但我在第17行得到一个错误:
有谁知道究竟是什么导致了这种不妥协? PS:我添加了这些丑陋的强制转换,以便在两个版本的Java下编译代码: Condition.isInRange((Comparable)param.get(),(Comparable) bound); 解决方法
首先,我不是泛型专家,所以我的答案可能不正确.我认为问题是isInRange方法的定义方式.
<T extends Comparable<T>> 这是一个递归定义,本身不是问题.看看像Double,Long这样的课程.我相信,由于如何解析递归定义,方法的类型(isInRange)必须是实现Comparable的类,它将自身用作Comparable的泛型;例如,C类实现Comparable< C>. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |