2015-04-13 51 views
1

关于分类泛型的堆栈溢出有很多问题;不过,我有兴趣以最简单的方式对泛型进行排序:没有任何嵌套。下面的代码是对一个通用集合或列表进行排序的尝试。了解泛型分类的基础知识

List<E> l = new LinkedList<>(arbSet); 
Collections.sort(l); 

arbSet只是一组元素:Set<E> arbSet

很明显,这是有问题的 - 它不应该工作。为了确保我知道这一点,Eclipse的让我对我的尝试调用下面.sort

约束不匹配:用的一般方法类型类别的排序(表< T>)不适用的参数(列表< E>)。推断的类型E不是有界参数的有效替代品< T延伸可比较的<? super T >>

所以,我做了一下文档咨询,看看sortspecifications

其结果是,我试图确保sort知道E延伸Comparable

第一行现在看起来像:

List<E extends Comparable<? super E>> l = new LinkedSet<>(arbSet); 

现在,Eclipse的规定:

语法错误在令牌“扩展”上,预计

我错过了什么?我觉得这是一个非常基本的例子,我只是缺少一些“手掌面对面”的东西。为了进一步简化它,所有的arbSet元素都是实现接口的元素。

+0

哪里类型参数'E'声明? – Radiodef

回答

2

只有当您提供自定义Comparator或者您尝试分类的元素实现接口时,才可以使用Collections.sort()。这取决于arbSet中存储的元素。

例如,如果你想创建一个接受一组,并返回集合中元素的列表排序的方法,你会做这样的事情:

static <E extends Comparable<E>> List<E> sortedListFrom(Set<E> set) { 
    List<E> l = new LinkedList<>(set); 
    Collections.sort(l); 
    return l; 
} 

编辑:

如果要做到这一点在构造函数中,你有两个选择:

  1. 就在构造函数之前声明的类型E。当然,这不会有太大的作用,因为list在构造函数完成后会丢失。

    class Test { 
        <E extends Comparable<E>> Test(Set<E> arbSet) { 
         List<E> list = new LinkedList<>(arbSet); 
         Collections.sort(list); 
         System.out.println(list); 
        } 
    } 
    
  2. 声明类型E在类,这样你就可以将结果保存在一个属性。

    class Test<E extends Comparable<E>> { 
        List<E> list; 
    
        Test(Set<E> arbSet) { 
         this.list = new ArrayList<>(arbSet); 
         Collections.sort(this.list); 
         System.out.println(this.list); 
        } 
    }