2014-02-20 43 views
0

行「if (l.head.item != 9」給了我這個錯誤,它說對象與int不兼容。我很困惑這是爲什麼?如何解決它?在Dlist中傳遞對象。

/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."); 

回答

0

由於DListNode1.item是一個對象不是整數。嘗試強制轉換爲Integer,並比較了Integer (9)

-1

它會給你的錯誤,因爲int是原始:

Incompatible operand types Object and int 

你的代碼更改爲:

希望這有助於。

+0

看到我對Kugathasan Abimaran的回答。 –

+0

嗯,你說的對,很好。感謝您的糾正。 –

1

正如其他人所指出的那樣,問題在於,l.head.item類型爲Object,你不能比較,與使用!===int

選項:

  • 演員l.head.itemIntegerint

    // 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引用(或空),和!=檢查將自動拆箱Integer到一個int和工作。

個人而言,我肯定會做出這種通用的,但我的猜測,你是比較新的Java和可能不想開始仿製藥,只是還沒有。

注意有使用equals並進行拆箱之間的差異:如果l.head.item的值是一個非Integer對象的引用,第一種方法會拋出一個ClassCastException,第二個會剛剛進入的身體if聲明(例如,字符串是而不是等於9)。哪一個更可取決於你想要在更大的程序中實現的目標:如果列表中包含非整數是完全合理的,則應使用equals檢查;如果它實際上表示出現編程錯誤,那麼最好有一個例外,因爲它會更快地提醒您錯誤,並阻止程序繼續進行無效假設。

在這兩種情況下,如果l.head.itemnull,您將得到一個NullPointerException。這可能是「固定」使用:

if (!Integer.valueOf(9).equals(l.head.item)) 

......但它又取決於你希望你的代碼如果值爲空你要做什麼。

+0

Casting可能會產生ClassCaseException。 –

+0

@KugathasanAimaimaran:確實。將要補充一點。 –

+0

我已經添加了它。所以,我是第一個正確的回答者。 :) –

0

比較使用等於方法。 '=='將比較參考。

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