我的项目是使用BSTree<E>
的电话簿。树的每个节点都是BTNode<E>
。在主类中,当我定义节点时,我将I替换为具有(String name, String number)
的Pair类。
我有以下比较器类来比较2种E类型:
import java.util.Comparator;
public class BTNodeComparator<E> implements Comparator<E>
{
public int compare(E a, E b) throws ClassCastException
{
return ((Comparable<E>) a).compareTo(b);
}
}
我在BSTree<E>
中使用它。
现在,当我运行程序并进入比较器时,它会给我比较器的错误,因为现在它在两个对之间进行比较
我该如何解决这个问题?我想要的是比较两对的名字吗?
对不起我的错误解释。我的英语很弱。
=========================
编辑:
@Tim:尝试解决方案后,它给了我这个错误:
java.lang.NullPointerException
at Pair.compareTo(Pair.java:36) // @ return name.compareTo(pair.getName());
at Pair.compareTo(Pair.java:2) // @ public class Pair implements Comparable<Pair>
at BTNodeComparator.compare(BTNodeComparator.java:24) // @ return (a.compareTo(b));
at BTNodeComparator.compare(BTNodeComparator.java:20) // @ public class BTNodeComparator<E extends Comparable<E>> implements Comparator<E>
at BSTree.search(BSTree.java:285)
at BSTree.insert(BSTree.java:300)
at PhoneBook.main(PhoneBook.java:25)
BTW,我在BSTree中删除了BTNodeComparator如下:
protected Comparator<E> c = new BTNodeComparator();
if (c.compare(target, cursor.getElement()) < 0) cursor = cursor.getLeft();
答案 0 :(得分:2)
我能看到的唯一可能的失败是ClassCastException
。
要修复代码,您需要指定Pair
类,如下所示:
class Pair implements Comparable<Pair> {
String name;
String number;
//some implementation stuff...
@Override
public int compareTo(Pair o) {
return name.compareTo(o.name);
}
}
通常,如果您的Comparator
实现依赖于实现Comparable
的泛型类型,那么您应该像这样指定它:
public class BTNodeComparator<E extends Comparable<E>> implements Comparator<E> {
public int compare(final E a, final E b) {
return a.compareTo(b);
}
}
这样做只会在不改变Comparator
工作方式的语义的情况下为您提供编译时安全性。
根据您的评论,我猜您将BTNodeComparator
嵌入到BSTree
类中作为嵌套的内部类,这意味着您可能无法在不更改类型的情况下进行更改BSTree
声明中的定义。