Stack Overflow上有很多关于排序泛型的问题;但是,我有兴趣以最简单的方式对泛型进行排序:没有嵌套。我在下面的代码是尝试对通用集 - 或列表 - 元素进行排序。
List<E> l = new LinkedList<>(arbSet);
Collections.sort(l);
arbSet
只是一组元素:Set<E> arbSet
。
显然,这是有问题的 - 它不应该起作用。为了确保我知道这一点,Eclipse为我尝试调用.sort
提供了以下内容:
绑定不匹配:类型集合的通用方法sort(List&lt; T&gt;)不适用于参数(List&lt; E&gt;)。推断的类型E不是有界参数的有效替代&lt; T扩展可比较&lt; ?超级T&gt;&gt;
所以,我做了一些文档咨询,看看sort
specifications。
因此,我尝试确保sort
知道E
延伸Comparable
:
第一行现在看起来像:
List<E extends Comparable<? super E>> l = new LinkedSet<>(arbSet);
现在,Eclipse声明:
令牌上的语法错误&#34;扩展&#34;,预期
我错过了什么?我觉得这是一个非常基本的例子,我只是错过了一些东西&#34; palm-to-face&#34;去年秋季。为了进一步简化,所有arbSet
元素都是实现Comparable
接口的元素。
答案 0 :(得分:2)
仅当您提供自定义Collections.sort()
或您尝试排序的元素实现Comparator
界面时,才能使用Comparable
。因此,它取决于arbSet
中存储的元素。
例如,如果您想创建一个接受集合的方法,并返回一个列表,其中set元素已排序,您可以执行以下操作:
static <E extends Comparable<E>> List<E> sortedListFrom(Set<E> set) {
List<E> l = new LinkedList<>(set);
Collections.sort(l);
return l;
}
编辑:
如果你想在构造函数中执行此操作,您有两个选择:
在构造函数之前声明类型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);
}
}
在类中声明类型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);
}
}