我想使用堆来实现优先级队列。队列将存储类型为Entry:K V的对象,其中K和V为键/值对。但是我很难使用我在Entry类中实现的compareTo方法。它不会编译。
public class Entry <K extends Comparable,V> implements Comparable<Entry>{
K key;
V value;
public int compareTo(Entry other) {
return key.compareTo(other.key);
}
}
public class PQ <Entry>{
Object[] queue;
public int compareEntries(Entry e1, Entry e2) {
return (e1.compareTo( e2));
}
}
在最后一行(e1.compareTo(e2))中,compareTo被突出显示,并且不会编译。它要求我强制转换e1,但会自动广播为废话。但是我不明白为什么它无法编译。
答案 0 :(得分:0)
问题是这样的:
public class PQ <Entry>{
这将“ Entry”声明为泛型类型的占位符,并且不指定您要使用Entry
类。您想完全删除<Entry>
,或者,如果需要将其删除,请执行以下操作:
public class PQ <T extends Entry>{
Object[] queue;
public int compareEntries(T e1, T e2) {
return (e1.compareTo( e2));
}
}
然后,当您创建类的实例时,可以执行以下操作:
PQ<Entry> pq = new PQ();
但是除非您需要PQ
接受比Entry
更多的类型,否则更好的解决方案是完全删除<Entry>
部分,以便您的类定义很简单:
public class PQ {
答案 1 :(得分:0)
您没有使用您认为自己的“条目”。
class PQ <Entry>
您正在创建一个名为“ Entry”的新通用类型参数。由于它是无限制的,因此您通常在人们通常使用T
(代表“类型”)时使用此标识符。您的泛型类型参数与类的名称相同的事实纯粹是偶然的。
您可能想要这样的东西:
public class PQ <K extends Comparable<K>, V>{
Object[] queue;
public int compareEntries(Entry<K, V> e1, Entry<K, V> e2) {
return (e1.compareTo( e2));
}
}
您的Entry类也可能是错误的。你可能想要
public class Entry <K extends Comparable<K>,V> implements Comparable<Entry<K, V>>{
请注意,任何给定的条目只能与具有相同类型的条目“ 仅可比较”。因为如果键的类型不同,如何比较两个条目?你如何比较一个整数和一个字符串?字符串和布尔值?等