2010-08-28 3 views
5

Ich verwende Java zurück.Holen Sie Java-Listen-Iterator, um etwas anderes als Objekt

Ich habe bereits eine Klasse für ein benutzerdefiniertes Objekt namens "Betreff".

Ich habe eine andere Klasse, die nur eine verknüpfte Liste von Subject-Objekten enthält. (genannt subjectsList)

Ich schrieb eine der Methoden ("getSubject()" genannt) in der subjectsList-Klasse, die das Subject-Objekt an einen bestimmten Index in der Linked List zurückgeben soll. Um dies zu tun, habe ich einen ListIterator verwendet. Ich würde einen ListIterator bei einem bestimmten Index in der LinkedList erstellen und die .next() -Methode verwenden.

Die .next() - Methode in einem ListIterator gibt jedoch nur ein java.lang.Object zurück, obwohl ich ein Subject-Objekt zurückgeben möchte.

Wie bekomme ich ListIterator.next(), um ein Subject-Objekt zurückzugeben?

Ich habe versucht Downcasting zu einem Thema, aber das scheint zu scheitern, und ich habe irgendwo gelesen, dass Sie nicht zusammenhängende Objekte nicht abwerten können.

Das ist meine subjectsList Klasse:

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(); 
    } 
} 

Das betreffende Verfahren ist die "getSubject()" Methode.

+0

in Java ändern sie die Konvention ist Klassennamen mit einem beginnen Großbuchstabe. Das erleichtert es anderen Benutzern, Ihren Code zu lesen. – extraneon

+0

Vielen Dank, dass Sie darauf hingewiesen haben. – Joshua

+0

Warum brauchen Sie eigentlich diesen 'ListIterator'? Was ist mit 'List.get (index)' und 'List.remove (index)' falsch? – whiskeysierra

Antwort

5

Sie benötigen Iterator zu erklären, wie:

private ListIterator<Subject> itr; 

Auch Ihr LinkedList-Objekt erstellen, wie im Konstruktor folgt:

l = new LinkedList<Subject>(); 

Sie auch zu Thema werfen könnte, während als Liste zurückkehr nur speichert Subjekt Objekt. Aber es wäre besser, Iterator wie vorher gesagt zu definieren.

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

Abgesehen von Ihrem Problem sehe ich Namenskonvention Problem in Ihrem Code. Es ist besser, ihm zu folgen und ein Habbit zu machen.

HINWEIS: Ich habe Änderungen an meiner Antwort vorgenommen, nachdem ich Ihr Beispiel in Eclipse IDE getestet habe. Ich würde vorschlagen, dass Sie IDE verwenden, da es Sie auch über solche Dinge warnen würde.

+0

Danke für den Hinweis ... Ich wusste nicht, dass Namenskonventionen so wichtig sind>. < Klassenname jetzt geändert. – Joshua

4

Sie können Generizität mit Ihrem ListIterator verwenden.

private ListIterator<Subject> itr; 

Jetzt itr.next() return Themen.

Ressourcen:

PS: Ich schlage vor, dass Sie die Instanziierung Ihrer LinkedList in l = new LinkedList<Subject>();

+0

Es ist auch erwähnenswert, dass viele Java-Compiler eine Warnung für 'private ListIterator itr;' über die Verwendung von Rohtypen erzeugen. –

+0

Oh vergessen über die im Konstruktor ... Danke! – Joshua