2010-08-28 14 views
5

Używam Java.Pobierz iterator listy Java, aby zwrócić coś innego niż Object

Mam już klasę dla niestandardowego obiektu o nazwie "Temat".

Mam inną klasę, która zawiera tylko Linked Linked obiektów Subject. (o nazwie subjectList)

Napisałem jedną z metod (zwaną "getSubject()") w klasie subjectsList, która ma zwrócić obiekt Subject w określonym indeksie na liście połączonej. Aby to zrobić, użyłem ListIteratora. Chciałbym utworzyć ListIterator na danym indeksie w LinkedList i użyć metody .next().

Jednak metoda .next() w ListIterator zwraca tylko java.lang.Object, mimo że chcę zwrócić obiekt Subject.

Jak uzyskać ListIterator.next(), aby zwrócić obiekt Subject?

Próbowałem downcasting do tematu, ale wydaje się to nie udać, a ja czytam gdzieś, że nie można spuszczać niepowiązanych obiektów.

To moja klasa subjectsList:

import java.util.*; 
public class subjectsList 
{ 
    //my LinkedList of Subject objects and a ListIterator 
    private LinkedList<Subject> l; 
    private ListIterator itr; 

    //constructor that simply creates a new empty LinkedList 
    public subjectsList() 
    { 
     l = new LinkedList(); 
    } 

    //Method to return the Subject object at a specific index in the LinkedList 
    public Subject getSubject(byte index) 
    { 
     itr = l.listIterator(index); 
     return itr.next(); 
    } 

    //Method to add a new Subject object to the LinkedList 
    public void addSubject(String nameInput, byte levelInput) 
    { 
     l.addLast(new Subject(nameInput, levelInput)); 
    } 

    //Method to remove the Subject object at a specific index in the LinkedList 
    public void removeSubject(byte index) 
    { 
     itr = l.listIterator(index); 
     itr.next(); 
     itr.remove(); 
    } 
} 

Sposób w pytaniu jest "getSubject()" metoda.

+0

w Javie jest to konwencja, aby rozpocząć nazwy klas z Wielka litera. Ułatwia to również innym osobom odczytanie kodu. – extraneon

+0

Dzięki za wskazanie tego. – Joshua

+0

Dlaczego faktycznie potrzebujesz 'ListIterator'? Co jest nie tak z 'List.get (indeks)' i 'List.remove (indeks)'? – whiskeysierra

Odpowiedz

5

Musisz zadeklarować swój iterator jako:

private ListIterator<Subject> itr; 

stworzyć także swój przedmiot LinkedList następująco w konstruktorze:

l = new LinkedList<Subject>(); 

Można również oddanych do tematu wracając jako listy wyłącznie magazynuje Obiekt podmiotu. Ale byłoby lepiej zdefiniować Iterator, jak wspomniano wcześniej.

public Subject getSubject(byte index) 
{ 
    itr = l.listIterator(index); 
    return (Subject)itr.next(); 
} 

Inne niż twój problem Widzę problem z konwencją nazewnictwa w twoim kodzie. Lepiej podążać za nim i zrobić habbit.

UWAGA: Dokonałem zmian w mojej odpowiedzi po wypróbowaniu przykładu w Eclipse IDE. Sugerowałbym, abyś używał IDE, ponieważ pokazywałoby ci również ostrzeżenie o takich rzeczach.

+0

Dzięki za wskazanie ... Nie wiedziałem, że konwencje nazewnictwa są tak ważne>. < Zmieniono nazwę klasy teraz. – Joshua

4

Możesz używać generyczności do swojej ListIterator.

private ListIterator<Subject> itr; 

Teraz itr.next() zwraca przedmioty.

Zasoby:

PS: I sugerują, że zmiany konkretyzacji swoimi LinkedList do l = new LinkedList<Subject>();

+0

Warto również zauważyć, że wiele kompilatorów Java wygeneruje ostrzeżenie dla 'private ListIterator itr;' o używaniu typów surowych. –

+0

Och, zapomniałem o w konstruktorze ... Dzięki! – Joshua

Powiązane problemy