泛型类的用法

时间:2014-03-15 07:39:00

标签: java generics

我试图通过Java了解泛型,但我有一些问题在我脑海中。

例如,让我们考虑一下优先级队列 ADT。我们可以通过接口来表示此ADT,我们可以将其称为MyPriorityQueue。现在,如果我没有错,我们将放入优先级队列的每个元素必须有两个组件,即“优先级值”和“值”。

我们可以创建一个名为Entry的类型来表示将放入优先级队列的条目。由于优先级值和值可以是任何类型,如果我没有错,Entry类应该是通用的。

现在,回到优先级队列ADT,如果我想用名为MyPriorityQueue的类实现MyPQ接口,因为每个优先级队列的元素必须是EntriesMyPQ应该是通用的吗?

从这个角度来看,它看起来不应该因为它只支持一种类型的元素,即Entry,但另一方面,它看起来应该是通用的。因为,比如两种类型的MyPQ个实例,第一个是名为toDoList的待办事项列表,第二个是名为boardingQueue的机场登机队列,不应该被允许有一个实例Entries另一方面,意味着不应该允许一个人Entry boardingQueue toDoList,反之亦然。

这表明MyPQ 应该是通用的。 MyPriorityQueue接口也应该是通用的吗?如果是的话,为什么呢?

我知道这是一篇很长的文字,但如果你能向我解释一下,我将非常感激。

2 个答案:

答案 0 :(得分:0)

是的,你必须使MyPQ通用;如果不这样做,你会遇到编译器问题。请记住,Entry是通用的,因此它的声明类似于:

public class Entry<K, V> {}

然后,您的MyPQ课程将使用您的Entry课程,强制它是通用的,如下所示:

public class MyPQ<K, V> implements MyPriorityQueue<K, V> {

    @Override
    public void add(Entry<K, V> entry){}
}

如果您未将MyPQ声明为通用,那么您在K中将Vadd(Entry<K, V> entry)替换为什么?所以你得到一个编译错误。

MyPriorityQueue接口而言,你还必须使它成为通用的,因为在那里你可能会有一些带有泛型参数的方法,实现必须覆盖它们,比如public void add(Entry<K, V> entry);

答案 1 :(得分:-1)

如果你看PriorityQueue,你会看到一个很好的实现。它是通用的,但需要Comparable(或Comparator)个对象。优先级直接来自比较,不需要特殊的Entry对象。

你可以用更学术的方式重新创建它,但是在不需要的时候有一个Entry类是没有价值的(与Map.Entry不同)。