我正在关注定义这个静态方法的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 Calendar并Calendar 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现在允许?(因为它现在让它更加混乱).那背后的新"规则"是什么?