泛型和 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 中定义。您的代码中没有任何内容告诉编译器类型参数 EComparable。您可以在泛型类型声明中执行此操作:

class Node<E extends Comparable<E>> {
   ...
}

默认情况下,如果您不声明 extends Comparable,则只能访问 java.lang.Object class.

中定义的方法

您没有说明 E 是如何定义的,但错误消息表明您没有在 E 的声明中放置 Comparable<E> 的上限。

您可以在 class:

public class SkipList<E extends Comparable<E>>

这将允许您在类型为 Ekey 变量上调用 compareTo

至于为什么 Eclipse 建议转换为 String,Eclipse 似乎在猜测要使其编译的最佳更改是什么。它可能猜到了 String,因为它是 Comparable<String>。在这种情况下,这是错误的,因为 E 不一定是 String。正如我上面所说,这里的解决方案是不同的:将 E 限制为 Comparable<E>.