泛型和 compareTo() 方法
Generics and compareTo() method
我正在尝试创建一个 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()
方法对于类型 E
是未定义的。在 Eclipse 中,它希望我添加两个这样的类型转换:
((String) p.getRight().getKey().compareTo((String) key) <= 0 )
为什么要String
?数据类型可以是任何东西。我尝试对 E
进行类型转换,但 Eclipse 想将其改回 String
。任何帮助将不胜感激。
方法 compareTo
在接口 java.lang.Comparable
中定义。您的代码中没有任何内容告诉编译器类型参数 E
是 Comparable
。您可以在泛型类型声明中执行此操作:
class Node<E extends Comparable<E>> {
...
}
默认情况下,如果您不声明 extends Comparable
,则只能访问 java.lang.Object
class.
中定义的方法
您没有说明 E
是如何定义的,但错误消息表明您没有在 E
的声明中放置 Comparable<E>
的上限。
您可以在 class:
public class SkipList<E extends Comparable<E>>
这将允许您在类型为 E
的 key
变量上调用 compareTo
。
至于为什么 Eclipse 建议转换为 String
,Eclipse 似乎在猜测要使其编译的最佳更改是什么。它可能猜到了 String
,因为它是 Comparable<String>
。在这种情况下,这是错误的,因为 E
不一定是 String
。正如我上面所说,这里的解决方案是不同的:将 E
限制为 Comparable<E>
.
我正在尝试创建一个 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()
方法对于类型 E
是未定义的。在 Eclipse 中,它希望我添加两个这样的类型转换:
((String) p.getRight().getKey().compareTo((String) key) <= 0 )
为什么要String
?数据类型可以是任何东西。我尝试对 E
进行类型转换,但 Eclipse 想将其改回 String
。任何帮助将不胜感激。
方法 compareTo
在接口 java.lang.Comparable
中定义。您的代码中没有任何内容告诉编译器类型参数 E
是 Comparable
。您可以在泛型类型声明中执行此操作:
class Node<E extends Comparable<E>> {
...
}
默认情况下,如果您不声明 extends Comparable
,则只能访问 java.lang.Object
class.
您没有说明 E
是如何定义的,但错误消息表明您没有在 E
的声明中放置 Comparable<E>
的上限。
您可以在 class:
public class SkipList<E extends Comparable<E>>
这将允许您在类型为 E
的 key
变量上调用 compareTo
。
至于为什么 Eclipse 建议转换为 String
,Eclipse 似乎在猜测要使其编译的最佳更改是什么。它可能猜到了 String
,因为它是 Comparable<String>
。在这种情况下,这是错误的,因为 E
不一定是 String
。正如我上面所说,这里的解决方案是不同的:将 E
限制为 Comparable<E>
.