我试图通过Java了解泛型,但我有一些问题在我脑海中。
例如,让我们考虑一下优先级队列 ADT。我们可以通过接口来表示此ADT,我们可以将其称为MyPriorityQueue
。现在,如果我没有错,我们将放入优先级队列的每个元素必须有两个组件,即“优先级值”和“值”。
我们可以创建一个名为Entry
的类型来表示将放入优先级队列的条目。由于优先级值和值可以是任何类型,如果我没有错,Entry
类应该是通用的。
现在,回到优先级队列ADT,如果我想用名为MyPriorityQueue
的类实现MyPQ
接口,因为每个优先级队列的元素必须是Entries
,MyPQ
应该是通用的吗?
从这个角度来看,它看起来不应该因为它只支持一种类型的元素,即Entry
,但另一方面,它看起来应该是通用的。因为,比如两种类型的MyPQ
个实例,第一个是名为toDoList
的待办事项列表,第二个是名为boardingQueue
的机场登机队列,不应该被允许有一个实例Entries
另一方面,意味着不应该允许一个人Entry
boardingQueue
toDoList
,反之亦然。
这表明MyPQ
应该是通用的。 MyPriorityQueue
接口也应该是通用的吗?如果是的话,为什么呢?
我知道这是一篇很长的文字,但如果你能向我解释一下,我将非常感激。
答案 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
中将V
和add(Entry<K, V> entry)
替换为什么?所以你得到一个编译错误。
就MyPriorityQueue
接口而言,你还必须使它成为通用的,因为在那里你可能会有一些带有泛型参数的方法,实现必须覆盖它们,比如public void add(Entry<K, V> entry);
。
答案 1 :(得分:-1)
如果你看PriorityQueue
,你会看到一个很好的实现。它是通用的,但需要Comparable
(或Comparator
)个对象。优先级直接来自比较,不需要特殊的Entry对象。
你可以用更学术的方式重新创建它,但是在不需要的时候有一个Entry类是没有价值的(与Map.Entry
不同)。