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
失败的原因是notypeT
既可与自身相比较,也可作为列表类型的超类型
结果是类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