将Integer对象转换为int类型的问题

时间:2015-06-29 03:24:45

标签: java binary-tree comparable treenode autoboxing

不确定这里发生了什么。看起来像一个自动拳击问题,但我已经坚持了一段时间,并认为它可能有利于我停止压力,并获得一些更有经验的手。该分配实质上是实现BST并将其扩展到AVL的实现,然后运行性能测试。为简化起见,我们可以坚持使用Integer作为通用。

我遇到的问题是比较两个节点。没有进行自动装箱,并且无法识别intValue()方法。

public class BinaryNode<Integer> implements Comparable<Integer>
{
   Integer data;
   BinaryNode<Integer> leftChild;
   BinaryNode<Integer> rightChild;
   int height;

   BinaryNode(Integer data)
   {
      this(data, null, null);
   }

   BinaryNode(Integer data, BinaryNode<Integer> lt, BinaryNode<Integer> rt)
   {
      this.data = data;
      this.leftChild = lt;
      this.rightChild = rt;
   }

   public Integer getData()
   {
      return this.data;
   }

   public BinaryNode<Integer> getLeft()
   {
      return leftChild;
   }
   public void setLeft(BinaryNode newNode)
   {
      this.leftChild = newNode;
   }

   public BinaryNode<Integer> getRight()
   {
      return rightChild;
   }
   public void setRight(BinaryNode newNode)
   {
      this.rightChild = newNode;
   }

   @Override
   public int compareTo(BinaryNode<Integer> otherNode)
   {
      return this.getData() - otherNode.getData();
   }
}

编辑:感谢您的快速反馈。这只是我需要以不同的方式看待这种互动,并理解我遇到的古怪行为。不幸的是,我必须使这个BinaryNode成为一个通用类,但诀窍是将所有的更换为或者本书的惯例更喜欢使用。

最佳解决方案是更改BinaryNode&lt; Integer&gt;到BinaryNode&lt; AnyType&gt;并从此类中删除compareTo。现在我不再为java.lang.Integer蒙上阴影了,我可以像我原先预期的那样可靠地使用Integer.compareTo方法。

对于好奇,这里是我必须与之交互的TreePrinter类,它使用参数化的BinaryNode类。 http://www.cs.sjsu.edu/~mak/CS146/assignments/3/TreePrinter.java

2 个答案:

答案 0 :(得分:1)

class BinaryNode<Integer>中,Integer是泛型类型参数,而不是Integer类。

变化

public class BinaryNode<Integer> implements Comparable<Integer>

public class BinaryNode implements Comparable<Integer>

并将BinaryNode<Integer>的任何外观更改为BinaryNode

如果您希望BinaryNode类采用通用数据类型,则不会编写特定于Integer数据类型的代码(例如,如果return this.getData() - otherNode.getData()返回某些通用,则getData()将永远不会编译类型参数T)。

答案 1 :(得分:1)

public class BinaryNode<Integer> implements Comparable<Integer>

表示您有一个名为Integer的新泛型类型。这不是java.lang.Integer。这就是你遇到问题的原因,因为它们完全不同。

Soritos Delimanolis指出,最好完全放弃通用类型。