泛型和compareTo()方法

cre*_*ess 6 java eclipse generics compare skip-lists

我正在尝试创建一个SkipList,我有一个采用通用数据类型的方法:

public void add(E key, Integer value)
{
    Node<E> p; 
    p = find(key);
}
Run Code Online (Sandbox Code Playgroud)

带你到这里:

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
    }
}
Run Code Online (Sandbox Code Playgroud)

问题出在compareTo()方法上.它说该compareTo()方法未定义类型E.在Eclipse中,它希望我添加两个这样的类型转换:

((String) p.getRight().getKey().compareTo((String) key) <= 0 )

它为什么要String?数据类型可以是任何东西.我尝试做类型转换,E但Eclipse希望将其改回String.任何帮助,将不胜感激.

rge*_*man 7

您尚未显示如何E定义,但错误消息表明您没有Comparable<E>在声明的上限上放置E.

你可以在课堂上用这样的东西来完成它:

public class SkipList<E extends Comparable<E>>
Run Code Online (Sandbox Code Playgroud)

这将允许您调用类型compareTokey变量E.

至于为什么Eclipse建议转换为a String,看起来Eclipse正在猜测要使其编译的最佳改变是什么.它可能已经猜到了,String因为它是Comparable<String>.在这种情况下,这是错误的,因为E不一定是String.这里的解决方案是不同的,如上所述:限制EComparable<E>.

  • 为了获得最佳效果,请使用`<E extends Comparable <?超级E >>` (2认同)

man*_*uti 5

该方法compareTo在界面中定义java.lang.Comparable.代码中没有任何内容告诉编译器类型参数E是什么Comparable.您可以在泛型类型声明中执行此操作:

class Node<E extends Comparable<E>> {
   ...
}
Run Code Online (Sandbox Code Playgroud)

默认情况下,如果不声明extends Comparable,则只能访问java.lang.Object类中定义的方法.