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

前端之家收集整理的这篇文章主要介绍了泛型 – java-8中有界通配符中的规则变化?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在按照 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被视为日历).

猜你在找的Java相关文章