【问题标题】:Generics and compareTo() method泛型和 compareTo() 方法
【发布时间】:2015-09-25 08:55:50
【问题描述】:

我正在尝试创建一个 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) &lt;= 0 )

为什么要String?数据类型可以是任何东西。我尝试对E 进行类型转换,但Eclipse 想将其改回String。任何帮助将不胜感激。

【问题讨论】:

  • 如果数据类型可以是任何类型(您没有显示定义),那么编译器不知道它是否有 compareTo() 方法,因为它可能是没有。
  • @OlivierPoulin 我试图修改 SkipList 的 this implementation 以包含泛型。这个方法只是遍历列表,寻找合适的地方可以添加节点。

标签: java eclipse generics compare skip-lists


【解决方案1】:

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

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

public class SkipList<E extends Comparable<E>>

这将允许您在 key 类型为 E 的变量上调用 compareTo。

至于为什么 Eclipse 建议将其转换为 String,看起来 Eclipse 正在猜测如何进行最佳更改以使其编译。它可能已经猜到了String,因为它是Comparable&lt;String&gt;。在这种情况下,这是错误的,因为E 不一定是String。正如我上面所说,这里的解决方案有所不同:将E 限制为Comparable&lt;E&gt;。

【讨论】:

  • 非常感谢!现在这很有意义。
  • 为了获得最佳效果,请使用&lt;E extends Comparable&lt;? super E&gt;&gt;
【解决方案2】:

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

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

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

【讨论】:

  • 哦!我不知道Comparable。感谢您的帮助!
  • 为了获得最佳效果,请使用&lt;E extends Comparable&lt;? super E&gt;&gt;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多