我正在实现Trie数据结构。当我使用外部类引用时,我在Eclipse IDE中收到以下错误。
该方法比较(捕获超级E的#1 - 捕获超级E的#1 - ) 类型比较器不适用于 参数(E,E)
public class Trie<E> implements Collection<E> {
private Comparator<? super E> comparator;
private class Entry<E> {
private Entry<E> parent;
private Set<Entry<E>> children;
private E data;
Entry(Entry<E> parent, E data){
this.parent = parent;
this.data = data;
parent.addChild(this);
}
boolean addChild(Entry<E> child){
if (children == null)
children = new TreeSet<Entry<E>>(
new Comparator<Entry<E>>() {
public int compare(Entry<E> o1, Entry<E> o2) {
return Trie.this.comparator.compare(o1.data, o2.data);
};
}
);
return children.add(child);
}
boolean removeChild(Entry<E> child){
boolean result = false;
if (children != null && children.contains(child)) {
result = children.remove(child);
if (children.size() == 0)
children = null;
}
return result;
}
}
}
如何解决?
答案 0 :(得分:2)
您在帖子The type parameter E is hiding the type E
上遗漏了一条重要警告:private class Entry<E>
。
内部类E
中的类型参数Entry
与外部类Trie
中的类型参数之间没有关系。您可以在E
中将F
更改为Entry
,您将收到完全相同的错误。
但是,如果您未在类声明<E>
中重新定义Entry
,那么它将起作用,因为内部类可以访问外部类的type参数(最初我忘记了)
您需要做的是:仅使用Entry<E>
替换Entry
的每一次出现。
public class Trie<E> implements Collection<E> {
private Comparator<? super E> comparator;
private class Entry {
private Entry parent;
private Set<Entry> children;
private E data;
Entry(Entry parent, E data) {
this.parent = parent;
this.data = data;
parent.addChild(this);
}
boolean addChild(Entry child) {
if (children == null)
children = new TreeSet<Entry>(new Comparator<Entry>() {
public int compare(Entry o1, Entry o2) {
return Trie.this.comparator.compare(o1.data, o2.data);
};
});
return children.add(child);
}
boolean removeChild(Entry child) {
boolean result = false;
if (children != null && children.contains(child)) {
result = children.remove(child);
if (children.size() == 0)
children = null;
}
return result;
}
}
}
这会让你的问题消失。