Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to use Java generics to avoid casting?

Tags:

java

generics

For the query, raised in link, Java generics is recommended to avoid difficulty in assessing run time type of an item.

After using Java generics in the below code, I do not see the incompatible type errors unlike before.

But a different compile time error at line 96 , DList1<int> l = new DList1<int>(); does not give any clue of the problem.

Error message is: 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;
  }
}

My question:

What is the meaning of this error at Line 96? How do i resolve this?

Note: using jre 1.6 update 45

like image 254
overexchange Avatar asked Jul 31 '26 02:07

overexchange


1 Answers

In Java you can't parametrize a type with primitive values like int, so instead of:

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

use wrapper classes:

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

like image 79
dcernahoschi Avatar answered Aug 01 '26 16:08

dcernahoschi



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!