在Dlist中传递对象。

时间:2014-02-20 06:45:18

标签: java

if (l.head.item != 9”行给了我错误,它说像object这样的东西与int不兼容。我真的很困惑,为什么会这样?怎么解决?

/ DListNode1 /

/* DListNode1.java */

public class DListNode1 {


  public Object item;
//  public short[][] colorVal;
  public DListNode1 prev;
  public DListNode1 next;


  DListNode1() {
    item = 0;
    prev = null;
    next = null;
  }

  DListNode1(Object i) {
    item = i;
    prev = null;
    next = null;
  }
}
//////////////
  /* Double linked list */
public class DList1 {

  protected DListNode1 head;
  protected DListNode1 tail;
  protected long size;

  public DList1() {
    head = null;
    tail = null;
    size = 0;
  }



  public DList1(Object a) {
    head = new DListNode1();
    tail = head;
    head.item = a;
    size = 1;
  }  
  public DList1(Object a, Object b) {
    head = new DListNode1();
    head.item = a;
    tail = new DListNode1();
    tail.item = b;
    head.next = tail;
    tail.prev = head;
    size = 2;
  }

  public void insertFront(Object i) {
    DListNode1 temp = new DListNode1(i);
    if (size == 0) {
      head = temp;
      tail = temp;
    }
    else {
      temp.next = head;
      head.prev = temp;
      head = temp;
    } size++;  
  }


  public void removeFront() {
    if (size == 0) {
      return;
    }
    else if (size == 1) {
      head = null;
      tail = null;
      size--;
    }
    else {
      head = head.next;
      head.prev = null;
      size--;
    }
  }

  public String toString() {
    String result = "[  ";
    DListNode1 current = head;
    while (current != null) {
      result = result + current.item + "  ";
      current = current.next;
    }
    return result + "]";
  }
/////////////

 public static void main(String[] args) {


    DList1 l = new DList1();
    l.insertFront(9);
     if (l.head.item != 9) {
        System.out.println("head.item is wrong.");

4 个答案:

答案 0 :(得分:1)

正如其他人所指出的那样,问题是l.head.item的类型为Object,您无法使用int!=将其与==进行比较{1}}。

选项:

  • l.head.item投放到Integerint

    // This could be done in one step if you wanted
    int headValue = (int) l.head.item;
    if (headValue != 9)
    

    或者

    // This could be done in one step if you wanted
    Integer headValue = (Integer) l.head.item;
    if (headValue != 9)
    

    或者你可以内联:

    if ((int) l.head.item != 9)
    
  • 请改为使用equals,这会自动将int列入Integer

    if (!head.equals(9))
    
  • 让你的类型变得通用,所以你有一个DListNode1<Integer>,然后你就可以确定所有节点值都是Integer个引用(或null)和{{ 1}}检查会自动将!=取消打包到Integer并正常工作。

就我个人而言,我肯定会把它变成通用的,但我的猜测是你对Java相对较新的,可能还不想从泛型开始。

请注意,使用int和执行取消装箱之间存在差异:如果equals的值是对非l.head.item对象的引用,则第一种方法将抛出{ {1}},第二个将进入Integer语句的主体(例如,字符串等于9)。哪个更好取决于你在更大的程序中想要实现的目标:如果你的列表包含非整数是完全合理的,你应该使用ClassCastException检查;如果它实际上表明编程错误,那么最好是例外,因为它会更快地提醒您错误,并阻止程序继续进行无效的假设。

如果ifequals,则两种情况都会得到l.head.item。这可以使用以下方式“修复”:

null

...但是,如果值为null,则取决于您希望代码执行的操作。

答案 1 :(得分:0)

因为DListNode1.item是对象而不是整数。尝试转换为Integer并与Integer (9)

进行比较

答案 2 :(得分:0)

使用等于方法进行比较。'=='将比较参考。

if(l.head.item.equals(new Integer(9))==false)

答案 3 :(得分:-1)

它会给你错误,因为int是原始的:

Incompatible operand types Object and int

将您的代码更改为:

if (!l.head.item.equals(new Integer(9))) {

希望这有帮助。