加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

泛型中的通配符在Java 7和8中表现不同

发布时间:2020-12-15 02:15:27 所属栏目:Java 来源:网络整理
导读:我有这个编译为 Java 7( Eclipse编译器)时编译好的代码,但是当我将项目设置设置为Java 8时失败: package scratch;class ParamT extends ComparableT { public Comparable? get() { return null; }}public class ConditionT extends ComparableT { public st
我有这个编译为 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的引用
>第17行:类型安全:未选中调用类型为条件的通用方法isInRange(T,T)的isInRange(Comparable,Comparable)

当我添加<?>在第15行,警告消失了,但我在第17行得到一个错误:

Bound mismatch: The generic method isInRange(T,T) of type
Condition is not applicable for the arguments
(Comparable,Comparable). The inferred
type Comparable is not a valid substitute for the
bounded parameter >

有谁知道究竟是什么导致了这种不妥协?

PS:我添加了这些丑陋的强制转换,以便在两个版本的Java下编译代码:

Condition.isInRange((Comparable)param.get(),(Comparable) bound);

解决方法

首先,我不是泛型专家,所以我的答案可能不正确.我认为问题是isInRange方法的定义方式.

<T extends Comparable<T>>

这是一个递归定义,本身不是问题.看看像Double,Long这样的课程.我相信,由于如何解析递归定义,方法的类型(isInRange)必须是实现Comparable的类,它将自身用作Comparable的泛型;例如,C类实现Comparable< C>.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读