规则在java-8中的有界通配符中更改?

swe*_*aro 7 generics typechecking bounded-types java-8 bounded-wildcard

我正在关注定义这个静态方法的Java中的泛型教程:

public static <T extends Comparable<T>> T min(T a) { ... }
Run Code Online (Sandbox Code Playgroud)

并说

min(new GregorianCalendar());
Run Code Online (Sandbox Code Playgroud)

不能编译,因为GregorianCalendar extends CalendarCalendar implements Comparable<Calendar>因此暗示GregorianCalendar implements Comparable<Calendar>和NOT Comparable<GregorianCalendar>.所以为了编译签名必须改成:

public static <T extends Comparable<? super T>> T min(T a) { ... }
Run Code Online (Sandbox Code Playgroud)

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

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

Jac*_* G. 4

类型推断!

\n\n

JLS \xc2\xa718中有大量与此相关的信息。具体来说,我将引导您访问JLS \xc2\xa718.2(第 678 页),其中指出:

\n\n

在此输入图像描述

\n\n

在你的情况下,让S = GregorianCalendarT = Calendar。该页面指出(在归约过程中)如果S是 的子类型T,则被S视为属于 类型TGregorianCalendar被视为Calendar)。

\n

  • JLS §18 中的术语稍微复杂一些,约束公式 `´S &lt;= T`` 表示“类型参数 S 包含在类型参数 T 中”_(参见 [§18.2.1](https: //docs.oracle.com/javase/specs/jls/se9/html/jls-18.html#jls-18.1.2)),而不是答案所示的子类型关系。 (5认同)