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

泛型 – java-8中有界通配符中的规则变化?

发布时间:2020-12-15 00:44:47 所属栏目:Java 来源:网络整理
导读:我正在按照 Java中的泛型定义这个静态方法的教程: public static T extends ComparableT T min(T a) { ... } 并说 min(new GregorianCalendar()); 无法编译因为GregorianCalendar扩展日历和日历实现了Comparable Calendar所以它暗示GregorianCalendar实现了
我正在按照 Java中的泛型定义这个静态方法的教程:
public static <T extends Comparable<T>> T min(T a) { ... }

并说

min(new GregorianCalendar());

无法编译因为GregorianCalendar扩展日历和日历实现了Comparable< Calendar>所以它暗示GregorianCalendar实现了Comparable< Calendar>和NOT Comparable< GregorianCalendar>.
所以为了编译签名必须改成:

public static <T extends Comparable<? super T>> T min(T a) { ... }

这完全可以理解.该方法的第一个版本有效地不能在java-5中编译,但它在java-8中编译! (我试过5到8)

为什么java-8现在允许? (因为它现在让它更加混乱).那背后的新“规则”是什么?

解决方法

类型推断!

在JLS §18中有大量关于此的信息.具体来说,我将指导您到JLS §18.2(第678页),其中指出:

在你的情况下,让S = GregorianCalendar和T = Calendar.该页面说明(在缩小过程中)如果S是T的子类型,则S被认为是T类型(GregorianCalendar被视为日历).

(编辑:李大同)

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

    推荐文章
      热点阅读