[英]How come generic type parameter says “extends” Comparable not “implements”? [duplicate]
这个问题在这里已有答案:
我试着编写从数组中删除重复元素的泛型函数。
public static <E extends Comparable<E>> ArrayList<E> removeDuplicate(E[] arr) {
//do quicksort
Arrays.sort(arr);
ArrayList<E> list = new ArrayList<E>();
int i;
for(i=0; i<arr.length-1; i++) {
if(arr[i].compareTo(arr[i+1]) != 0) { //if not duplicate, add to the list
list.add(arr[i]);
}
}
list.add(arr[i]); //add last element
return list;
}
正如您所看到的,您无法传递像int []数组这样的原始类型,因为我通过在Comparable接口中定义的compareTo()方法来比较元素。
我注意到第一行(方法声明):
public static <E extends Comparable<E>> ArrayList<E> removeDuplicate(E[] arr) {
它怎么说“扩展可比”?
可比较是一个接口,为什么它不“实现可比”? 这是我第一次编写泛型函数,所以我对这些细节感到困惑。 (任何疑惑都会阻止我理解..)
编辑:发现此文章与此主题相关。
这只是为泛型选择的惯例。 当使用有界类型参数时,您使用extends(即使它可能意味着在某些情况下实现)或super。
您甚至可以执行类似<E extends Comparable<E> & Cloneable>
来定义替换type参数的对象应该实现这两个接口。
如果你想使用实现的东西你只是写为通用参数
class Bar extends Foo<String> { /* Code */}
您正在谈论的通配符是三个
- “?extends Type”:表示Type类型的子类型。 这是最有用的通配符
- “?super Type”:表示Type类型的超类型
- “?”:表示所有类型或任何类型的集合
你的方法应该是这样的
public static <T extends Comparable<? super T>> Collection<T> sort(T[] list) {
Collection<T> list = new ArrayList<T>();
//do quicksort
Arrays.sort(arr);
Collection<T> list = new ArrayList<T>();
int i;
for(i=0; i<arr.length-1; i++) {
if(arr[i].compareTo(arr[i+1]) != 0) { //if not duplicate, add to the list
list.add(arr[i]);
}
}
list.add(arr[i]); //add last element
//btw how do You know that last is not duplicate
return list;
}
有关详细信息,请访问此页面
首先, E
可能是一个界面。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.