2014-10-04 5 views
3

Для запроса, поднятого в link, Java generics рекомендуется избегать трудностей при оценке типа времени выполнения элемента.Как использовать генераторы Java, чтобы избежать кастинга?

После использования Java-дженериков в приведенном ниже коде, я не вижу ошибки несовместимого типа в отличие от предыдущих.

Но другая ошибка времени компиляции в line 96, DList1<int> l = new DList1<int>(); не дает никакого представления об этой проблеме.

сообщение об ошибке: Syntax error on token 'int'

/* DList1.java */ 

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

public class DList1<T> { 

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

    protected DListNode1<T> head; 
    protected DListNode1<T> 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(T item) { 
     if(this.head == null){ 
      this.head = new DListNode1<T>(item); 
      this.tail = this.head; 
     }else{ 
      DListNode1<T> newNode = new DListNode1<T>(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<T> 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<int> l = new DList1<int>(); //Line 96 
    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 104 
      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.item != 9) { 
     System.out.println("tail.item is wrong."); 
     }*/ 
     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."); 
    } 
    } /* end main() */ 

} 

/* DListNode1.java */ 

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

class DListNode1<T> { 

    /** 
    * 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. 
    */ 

    T item; 
    DListNode1<T> prev; 
    DListNode1<T> next; 

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

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

Мой вопрос:

Каков смысл этой ошибки в Line 96? Как это решить?

Примечание: с помощью JRE 1.6 обновление 45

+0

Вы не можете использовать примитивный тип как общий тип. Только тип объекта. 'DList ' в порядке. 'DList ' нет. –

ответ

5

В Java вы не можете параметризовать тип с примитивными значениями как int, так вместо:

DList1<int> l = new DList1<int>();

использовать классы-оболочки:

DList1<Integer> l = new DList1<Integer>();

+0

, то что такое тип времени выполнения '9' в' l.head.item! = 9' строке 104? – overexchange

+0

Целочисленный литерал по определению имеет тип int. 9 - целочисленный литерал. Это, таким образом, int. –

+0

Как значение '9' типа' int' сравнивается с объектом типа 'class Integer' во время выполнения в строке 104? – overexchange

Смежные вопросы