如何使用嵌套的通用参数创建MinMaxPriorityQueue?

时间:2011-02-18 18:55:29

标签: java generics guava

如何使用嵌套的通用参数创建MinMaxPriorityQueue,如:

MinMaxPriorityQueue<AtomicCountHolder<E>> sortedHeap;

我尝试过使用静态create()方法可以想到的各种变体,而构建器无济于事。它适用于

MinMaxPriorityQueue<Integer> s = MinMaxPriorityQueue. <Integer>create();

但不是嵌套泛型。任何线索都会有所帮助。

3 个答案:

答案 0 :(得分:7)

MinMaxPriorityQueue.create()强制限制泛型类型必须实现Comparable接口,即该类型的实例有自然排序。

我认为AtomicCountHolder<E>没有实现Comparable。在这种情况下,您必须提供定义类型排序的自定义Comparator。例如,

MinMaxPriorityQueue<AtomicCountHolder<E>> sortedHeap = MinMaxPriorityQueue.orderedBy(Ordering.natural().onResultOf(someFunction)).create();

这假设您有Function AtomicCountHolder<E>并返回Comparable的内容,如Integer。假设E具有可比性,您可以编写一个Function来获取AtomicCountHolder<E extends Comparable<? super E>>并返回AtomicCountHolder所指的任何内容。

什么是AtomicCountHolder btw?是AtomicInteger吗?

答案 1 :(得分:0)

编辑:@ sjr的答案是对的,那么 - 你的AtomicCountHolder<E>课程需要实施Comparable<AtomicCountHolder<E>>。顺便说一下,AtomicInteger没有实现Comparable<AtomicInteger>


此外,E必须是声明的类型。您需要在具有名为E的参数类型的类中定义优先级队列:

public class Example<E> {
  MinMaxPriorityQueue<AtomicCountHolder<E>> sortedHeap =
      MinMaxPriorityQueue.create();
}

...或者您需要在其位置指定现有类型:

MinMaxPriorityQueue<AtomicCountHolder<Integer>> sortedHeap =
    MinMaxPriorityQueue.create();

您也可以像往常一样使用通配符(假设AtomicCountHolder的参数类型没有约束):

MinMaxPriorityQueue<AtomicCountHolder<?>> sortedHeap =
    MinMaxPriorityQueue.create();

答案 2 :(得分:0)

请注意,MinMaxPriorityQueue假定其元素不会以改变其排序的方式更改。如果AtomicCountHolder类是可变的,顾名思义,您的行为可能不正确。