Java Collections.sort()声明:为什么<;?超级T>;而不是<;T>;

Java Collections.sort()声明:为什么<;?超级T>;而不是<;T>;,java,generics,collections,comparable,Java,Generics,Collections,Comparable,为什么有签名: public static <T extends Comparable<? super T>> void sort(List<T> list) 公共静态它们之所以不同是因为?超级T的限制性比T小。这是一个(链接的Java教程部分说) 术语List比List更具限制性,您提议的签名可能在Java-8中工作。然而,在以前的Java版本中,类型推断并不是那么聪明。考虑你有列表< /代码>。请注意,java.sql.Date扩展了java.util

为什么有签名:

public static <T extends Comparable<? super T>> void sort(List<T> list) 

公共静态它们之所以不同是因为
?超级T
的限制性比
T
小。这是一个(链接的Java教程部分说)


术语
List
List更具限制性,您提议的签名可能在Java-8中工作。然而,在以前的Java版本中,类型推断并不是那么聪明。考虑你有<代码>列表< /代码>。请注意,
java.sql.Date
扩展了
java.util.Date
,它实现了
Comparable
。编译时

List<java.sql.Date> list = new ArrayList<>();
Collections.sort(list);
这里的
T
应推断为
java.util.Date
。然而,Java7规范不允许这种推断。因此,此代码可以用Java-8编译,但在Java-7下编译时失败:

Main.java:14: error: method sort in class Main cannot be applied to given types;
        sort(list);
        ^
  required: List<? extends T>
  found: List<Date>
  reason: inferred type does not conform to declared bound(s)
    inferred: Date
    bound(s): Comparable<Date>
  where T is a type-variable:
    T extends Comparable<T> declared in method <T>sort(List<? extends T>)
1 error
Main.java:14:错误:类Main中的方法排序不能应用于给定类型;
排序(列表);
^
必填项:列表
那么如果你有

List<A> list = ... ;
sort0(list); // works
sort1(list); // fails
List=;
sort0(列表);//作品
sort1(列表);//失败
sort1
失败的原因是notype
T
既可与自身相比较,也可作为列表类型的超类型


结果是类
A
的格式不正确,因为
可比的对象需要满足某些要求。特别是,颠倒比较应该颠倒结果的符号。我们可以将
A
的实例与
对象进行比较,但不能将
对象与
对象进行比较,因此违反了此要求。但请注意,这是
compariable
语义的要求,而不是由类型系统强加的。仅考虑类型系统,这两个
sort
声明实际上是不同的。

但是我在sort()的参数中增加了灵活性…使用?扩展,是的,没有人说
列表我认为你的答案与这个问题没有直接关系。但是static@prvn如何,这里你有
可比性还有一点。当您有一个通配符类型,如
List@Holger:但这是实现者的内部实现问题。我们只是看看公共API,它不应该受到内部实现细节的影响。@newacct:如果两个变量对调用方没有影响,您可能会选择一个更容易实现的变量。然而,开发人员开始习惯于认为
列表的参数
Main.java:14: error: method sort in class Main cannot be applied to given types;
        sort(list);
        ^
  required: List<? extends T>
  found: List<Date>
  reason: inferred type does not conform to declared bound(s)
    inferred: Date
    bound(s): Comparable<Date>
  where T is a type-variable:
    T extends Comparable<T> declared in method <T>sort(List<? extends T>)
1 error
// 0
public static <T extends Comparable<? super T>> void sort0(List<T> list) 

// 1
public static <T extends Comparable<T>> void sort1(List<? extends T> list)
class A implements Comparable<Object> { ... }
List<A> list = ... ;
sort0(list); // works
sort1(list); // fails