java.lang.Comparable <k>中的compareTo(K)无法应用于(java.lang.Comparable)</k>

时间:2014-11-20 14:13:21

标签: java generics

我正在尝试定义一个泛型类,它可以使用定义了Comparable接口的任何数据类型。     

错误消息是compareTo(Key) in java.lang.Comparable<Key> cannot be applied to (java.lang.Comparable) on line 22

我怀疑这与我的TreeNode类声明有关,但我无法弄清楚它是什么。  

Warnings [unchecked] unchecked call to TreeNode(Key) as a member of the raw type findLargestKElementsInTree.TreeNode on line 16

    class findLargestKElementsInTree<Key extends Comparable<Key>>{
      TreeNode root;

      int count=1;

      public void insert(Key k)
      {
       this.insert(k,root,root);

      }
      private void insert(Key k, TreeNode node,TreeNode parent)
      {
        if(this.root==null)
         root=new TreeNode(k);
        if(node==null)
        {
          node=new TreeNode(k);
          if(parent != null)
          {
           if(k.compareTo(parent.data)<0)
             parent.left=node;
           else
             parent.right=node;
          }
        }
        else
        {
          if(node.data.compareTo(k)>0)
             insert(k,node.left,node);
          else if(node.data.compareTo(k)<0)
             insert(k,node.right,node);
          else
            return;
        }
      }



      public void printK(int k)
      {
        postOrderK(root,k);
      }
      /*
       *       42
       *    40
       * 20    25
       *    10
       *      5
       * 
       * 
       * 
       * */
      public void postOrderK(TreeNode n,int k)
      {
       if(n==null) 
         return;
       if(n.right!=null)
         postOrderK(n.right,k);
       if(count <= k)
       {
         System.out.println(count+" largest number "+n.data);
         count++;
       }
       postOrderK(n.left,k);


      }

       public class TreeNode<Key extends Comparable<Key>>{
         Key data;
         TreeNode left;
         TreeNode right;
         TreeNode(Key d)
         {
           this.data=d;
           this.left=null;
           this.right=null;
         }
       }

       public static void main(String[] args)
       {
         findLargestKElementsInTree<Integer> tree=new findLargestKElementsInTree<Integer>();
         tree.insert(20);
         tree.insert(40);
         tree.insert(10);
         tree.insert(5);
         tree.insert(42);
         tree.insert(25);
         tree.printK(7);

       }

     }

我已经查看了有关堆栈溢出的其他问题,似乎有助于解决类似的问题,但建议的解决方案是使用泛型类,我想我已经有了。

提前致谢!

2 个答案:

答案 0 :(得分:3)

查看您方法的签名:

private void insert(Key k, TreeNode node, TreeNode parent) {

您的nodeparent参数具有原始TreeNode类型,但TreeNode是通用类。通过适当参数化来修复它:

private void insert(Key k, TreeNode<Key> node, TreeNode<Key> parent) {

rootleftright个实例变量相同。

答案 1 :(得分:1)

我认为您缺少的是声明root实例使用泛型类型TreeNode<Key>而不是原始类型TreeNode

class findLargestKElementsInTree<Key extends Comparable<Key>>{
  TreeNode<Key> root;
  ...

您应该将原始类型TreeNode的所有地点替换为TreeNode<Key>