mas*_*san 11 java generics comparator
我试着编写从数组中删除重复元素的泛型函数.
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;
}
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,您无法传递像int []数组这样的原始类型,因为我通过在Comparable接口中定义的compareTo()方法来比较元素.
我注意到第一行(方法声明):
public static <E extends Comparable<E>> ArrayList<E> removeDuplicate(E[] arr) {
Run Code Online (Sandbox Code Playgroud)
它怎么说"扩展可比"?
可比较是一个接口,为什么它不"实现可比"?这是我第一次编写泛型函数,所以我对这些细节感到困惑.(任何疑惑都会阻止我理解..)
编辑:发现此文章与此主题相关.
And*_*anu 10
这只是为泛型选择的惯例.当使用有界类型参数时,您使用extends(即使它可能意味着在某些情况下实现)或super.
您甚至可以执行类似的操作<E extends Comparable<E> & Cloneable>
来定义替换type参数的对象应该实现这两个接口.
如果你想使用实现的东西你只是wirte作为通用参数
class Bar extends Foo<String> { /* Code */}
Run Code Online (Sandbox Code Playgroud)
您正在谈论的通配符是三个
- "?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;
}
Run Code Online (Sandbox Code Playgroud)
对于detali请求访问此页面