2014-02-20 2 views
0
/* 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 class num{ 
    public int j; 
    public num() { 
     this.j = 34; 
    } 
    } 
public class testing{ 
    private DList1 dli; 
    private num n; 

    public testing(){ 
    dli = new DList1(); 
    n = new num(); 
    dli.insertFront(n);} 
     public static void main(String[] args) { 
      testing Jimmy = new testing(); 
      System.out.printf(" this should be 34 %d\n",Jimmy.dli.head.item.j);// dont' work. 
     } 
    } 

Может кто-нибудь сказать мне, почему я не могу сделать Jimmy.dli.head.item.j? Это имеет смысл, и, тем не менее, он сказал, что «j не может быть разрешен или не является полем». Как исправить это, чтобы он напечатал 34? без этой строки "dli.insertFront (n.j);"Передача объекта в DList

+1

Кто такой 'Джимми'? o.O – Smutje

+0

'item''s type is' Object' и 'Object' не имеет поля с именем' j' –

+0

item is n right? не является n.j = 34? – user3331457

ответ

0

изделие имеет номер справа? не n.j = 34

Да, вы создали num объект и назначили его item. Однако item является ссылкой только на Object часть num - следовательно, посредством этой ссылки вы можете получить доступ только к тем членам, которые являются частью суперкласса Object (num неявно наследует от Object).

Есть ли способ доступа к 34?

Да, вы можете броситьJimmy.dli.head.item обратно num для доступа к j члена, как ((num)Jimmy.dli.head.item).j.

Однако, надлежащим образом реализовать это сделать DListNode1 и DList1общий вместо использования Object в качестве элемента элемента:

public class DListNode1 <T> { 
    public T item; 
    ... 

public class DList1 <T> { 
    protected DListNode1<T> head; 
    protected DListNode1<T> tail; 
    ... 

Везде, где вы используете Object в ваших DListNode1 и DList1 классов, использование T сейчас.

Затем вы можете создать экземпляр типа безопасного DList1 как

DList1<num> dli = new DList1<>(); 

С item теперь типа num, а не Object, вы можете получить доступ к его j элемент, как вы хотели:

System.out.printf(" this should be 34 %d\n",Jimmy.dli.head.item.j); 

См. Также The Java Tutorials, Lesson: Generics.

BTW, вы должны привыкнуть к Code Conventions for the Java Programming Language - например. имена классов должны начинаться с прописной буквы (Testing вместо testing, Num вместо num).

+0

поэтому в методах я должен использовать T также? что-то вроде public Dlist1 (T a, T b) {} Или вставитьFront (T i) {} ???Не работает, хотя В инициализации DListNode() {item = 0;} он сказал что-то вроде int не может преобразовать в T. – user3331457

+0

Да, точно. И используйте 'null' вместо' 0' (0 работает в вашем случае, потому что он автобоксирован в объект Integer) –

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