2014-10-04 48 views
1

在下面的程序中,DList1是一個列表抽象。如何比較不同類型的對象?

我想在DList1類的main()函數中運行一些單元測試用例。

具體而言,

main()方法在Line 105l.head.item != 9,給出編譯錯誤:Incompatible operand types Object and int

在編譯時,值9是原始類型intl.head.item的類型是class Object

在運行時,l.head.item將是class Integer類型。我不確定價值的類型9

/* DList1.java */ 

/** 
* A DList1 is a mutable doubly-linked list. (No sentinel, not 
* circularly linked.) 
*/ 

public class DList1 { 

    /** 
    * head references the first node. 
    * tail references the last node. 
    * 
    * DO NOT CHANGE THE FOLLOWING FIELD DECLARATIONS. 
    */ 

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

    /* DList1 invariants: 
    * 1) head.prev == null. 
    * 2) tail.next == null. 
    * 3) For any DListNode1 x in a DList, if x.next == y and x.next != null, 
    *  then y.prev == x. 
    * 4) For any DListNode1 x in a DList, if x.prev == y and x.prev != null, 
    *  then y.next == x. 
    * 5) The tail can be accessed from the head by a sequence of "next" 
    *  references. 
    * 6) size is the number of DListNode1s that can be accessed from the 
    *  head by a sequence of "next" references. 
    */ 

    /** 
    * DList1() constructor for an empty DList1. 
    */ 
    public DList1() { 
    this.head = null; 
    this.tail = null; 
    this.size = 0; 
    } 


    /** 
    * insertFront() inserts an item at the front of a DList1. 
    */ 
    public void insertFront(Object item) { 
     if(this.head == null){ 
      this.head = new DListNode1(item); 
      this.tail = this.head; 
     }else{ 
      DListNode1 newNode = new DListNode1(item); 
      newNode.next = this.head; 
      this.head.prev = newNode; 
      this.head = newNode; 
     } 
     this.size++; 
    } 

    /** 
    * removeFront() removes the first item (and node) from a DList1. If the 
    * list is empty, do nothing. 
    */ 
    public void removeFront() { 
     if(this.size == 0){ 
      return; 
     }else if(size ==1){ 
      this.head = null; 
      this.tail = null; 
     }else{ 
      this.head.next.prev = null; 
      this.head = this.head.next; 
     } 
    } 

    /** 
    * toString() returns a String representation of this DList. 
    * 
    * DO NOT CHANGE THIS METHOD. 
    * 
    * @return a String representation of this DList. 
    */ 
    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) { 
    // DO NOT CHANGE THE FOLLOWING CODE. 

    DList1 l = new DList1(); 
    System.out.println("### TESTING insertFront ###\nEmpty list is " + l); 

    l.insertFront(9); 
    System.out.println("\nInserting 9 at front.\nList with 9 is " + l); 
    if (l.head == null) { 
     System.out.println("head is null."); 
    } else { 
     if (l.head.item != 9) { //Line 105 
      System.out.println("head.item is wrong."); 
     } 
     if (l.head.prev != null) { 
      System.out.println("head.prev is wrong."); 
     } 
    } 
    if (l.tail == null) { 
     System.out.println("tail is null."); 
    } else { 
     /*if (l.tail.item != 9) { 
     System.out.println("tail.item is wrong."); 
     } 
     if (l.tail.next != null) { 
     System.out.println("tail.next is wrong."); 
     }*/ 
    } 
    if (l.size != 1) { 
     System.out.println("size is wrong."); 
    } 

    l.insertFront(8); 
    System.out.println("\nInserting 8 at front.\nList with 8 and 9 is " + l); 
    if (l.head == null) { 
     System.out.println("head is null."); 
    } else { 
     /*if (l.head.item != 8) { 
     System.out.println("head.item is wrong."); 
     }*/ 
     if (l.head.prev != null) { 
     System.out.println("head.prev is wrong."); 
     } 
     if (l.head.next != l.tail) { 
     System.out.println("head.next is wrong."); 
     } 
    } 
    if (l.tail == null) { 
     System.out.println("tail is null."); 
    } else { 
     if (l.tail.next != null) { 
     System.out.println("tail.next is wrong."); 
     } 
     if (l.tail.prev != l.head) { 
     System.out.println("tail.prev is wrong."); 
     } 
    } 
    if (l.size != 2) { 
     System.out.println("size is wrong."); 
    } 

    } 

} 

/* DListNode1.java */ 

/** 
* A DListNode1 is a node in a DList1 (doubly-linked list). 
*/ 

class DListNode1 { 

    /** 
    * item references the item stored in the current node. 
    * prev references the previous node in the DList. 
    * next references the next node in the DList. 
    * 
    * DO NOT CHANGE THE FOLLOWING FIELD DECLARATIONS. 
    */ 

    Object item; 
    DListNode1 prev; 
    DListNode1 next; 

    /** 
    * DListNode1() constructor. 
    */ 
    DListNode1() { 
    this.item = null; 
    this.prev = null; 
    this.next = null; 
    } 

    DListNode1(Object item) { 
    this.item = item; 
    this.prev = null; 
    this.next = null; 
    } 
} 

我的問題:

我怎樣才能讓這兩個類型在編譯時兼容和運行時間,讓價值Line 105得到比較?什麼是運行時間類型的值9

+0

投爲整數,然後l.item.head.equals(9) – sscnapoli1926 2014-10-04 11:01:32

+0

@ sscnapoli1926在更新'head.item'小錯字。我的第二部分查詢呢? – overexchange 2014-10-04 11:07:39

+1

如果您參考「!」它不是一個錯字,它是否定運算符!無論如何,如果您需要在運行時決定項目的類型,唯一的方法就是使用泛型替換對象字段。如果「item」可以是你的課程的一個實例,你必須提供一個equals()覆蓋,並且遊戲完成 – sscnapoli1926 2014-10-04 11:12:56

回答

1
  1. 您可以在對比之前,使用一個類型轉換:(int)l.head.item != 9(它在Java 7中,後來,在舊版本,你可以使用(Integer)l.head.item)。
  2. 如果您的列表應該是同質的,使用泛型是一個好主意。
+0

什麼是運行時間類型的值'9' – overexchange 2014-10-04 11:10:13

+0

@overchange int – kraskevich 2014-10-04 11:11:40

0

如您所述,編譯器無法將基本原型intObject進行比較。解決此問題的方法是使用Integer包裝類:

if (Integer.valueOf(9).equals(l.head.item)) { //Line 105