关于声明可比较对象列表的Java问题



这是一个非常简单的例子。我想声明一个对象列表,但我想确保所有对象都实现了Comparable接口。我该怎么办?我试着写

   List<Comparable> heap = new ArrayList<Comparable>();

但编译器给了我一个警告。写它的正确方式是什么?

感谢

跟进:我以为我在发布之前已经完成了这个问题,但显然我没有。所以让我把它做完。

我的目的是有一个对象列表:

  1. 实现Comparable接口
  2. 都是同一类型的

我能把它做成吗

   List<Comparable<?>> heap = new ArrayList<Comparable<?>>()

不,我不能。原因是我需要从列表中检索元素并进行比较。类似:

   if( heap.get(0).compareTo(heap.get(1)) > 0)

如果我使用通配符List<Comparable<?>>,编译器会给我一个错误。说heap.get(0)不能匹配heap.get(1),所以我需要知道声明它的正确方法。

我发现有人问我警告是什么……这让我很惊讶……嗯,警告是:Comparable是一种原始类型。对泛型类型Comparable的引用应参数化

这是因为您使用的是原始类型Comparable。您可以尝试给Comparable一个通配符类型的参数:

List<Comparable<?>> heap = new ArrayList<Comparable<?>>();

如果你想让所有的对象都是相同的类型,你可以按照的思路做一些事情

public static <T extends Comparable<? super T>> List<T> getList() {
    ...
}

并从getList()返回您的列表。

由于所有对象都是同一类型(比如FooType),所以只需使用List<FooType>

也许您可以编写一个只接受扩展Comparable的类型并返回该类型的List的方法:

public <T extends Comparable> List<T> getComparableList(T t) {
    List<T> heap = new ArrayList<T>();
    return heap;
}

最新更新