我正在尝试创建一个SkipList,并且我有一个采用通用数据类型的方法:
public void add(E key, Integer value)
{
Node<E> p;
p = find(key);
}
带你到这里:
public Node<E> find(E key)
{
//Start at head
Node<E> p = head;
while (true)
{
while ( (p.getRight().getKey() != Node.posInf) && (p.getRight().getKey().compareTo(key) <= 0 ))
{
p.setRight(p.getRight());
}
//More stuff down here
}
}
问题出在compareTo()
方法上。它表示类型compareTo()
的{{1}}方法未定义。在Eclipse中,它希望我添加两个这样的类型转换:
E
为什么要((String) p.getRight().getKey().compareTo((String) key) <= 0 )
?数据类型可以是任何东西。我尝试使用String
进行类型转换,但Eclipse希望将其更改回E
。任何帮助将不胜感激。
答案 0 :(得分:7)
您尚未显示E
的定义方式,但错误消息表明您没有在Comparable<E>
的声明上放置E
的上限。
你可以在课堂上用这样的东西来实现这个目标:
public class SkipList<E extends Comparable<E>>
这样,您就可以在compareTo
类型的key
变量上拨打E
。
至于为什么Eclipse建议转换为String
,看起来Eclipse正在猜测要使其编译的最佳改变是什么。它可能已经猜到String
,因为它是Comparable<String>
。在这种情况下,这是错误的,因为E
不一定是String
。如上所述,此处的解决方案有所不同:将E
限制为Comparable<E>
。
答案 1 :(得分:5)
方法compareTo
在接口java.lang.Comparable
中定义。代码中没有任何内容告诉编译器类型参数E
是Comparable
。您可以在泛型类型声明中执行此操作:
class Node<E extends Comparable<E>> {
...
}
默认情况下,如果您未声明extends Comparable
,则只能访问java.lang.Object
类中定义的方法。