泛型和compareTo()方法

时间:2015-07-07 17:50:16

标签: java eclipse generics compare skip-lists

我正在尝试创建一个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。任何帮助将不胜感激。

2 个答案:

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

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

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