2014-02-20 3 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

Это даст вам сообщение об ошибке, потому что ИНТ примитивно:

Incompatible operand types Object and int 

Изменить код:

Надеется, что это помогает.

+0

Просмотреть комментарии на вопрос Кугатасана Абимарана. –

+0

Хм, ты прав, хороший улов. Спасибо за исправление. –

1

Как уже отмечалось, проблема заключается в том, что тип l.head.item является Object, и вы не можете сравнить, что с помощью int!= или ==.

Варианты:

  • l.head.item Cast к Integer или int:

    // 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.item является null, вы получите NullPointerException. Это может быть «фиксированной» с помощью:

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

... но опять же это зависит от того, что вы хотите, чтобы ваш код делать, если значение равно нулю.

+0

Кастинг может производить ClassCaseException. –

+0

@ KugathasanAbimaran: Действительно. Собирался добавить об этом. –

+0

Я уже добавил. Итак, я первый правильный ответчик. :) –

0

Сравнение с использованием равно способ. '==' будет сравнивать рефренс.

if(l.head.item.equals(new Integer(9))==false) 
Смежные вопросы