2010-08-28 3 views
5

Uso Java.Ottenere l'iteratore di elenco Java per restituire qualcosa di diverso dall'oggetto

Ho già una classe per un oggetto personalizzato chiamato "Oggetto".

Ho un'altra classe che contiene solo un elenco collegato di oggetti Oggetto. (chiamato topicsList)

Ho scritto uno dei metodi (chiamato "getSubject()") nella classe subjectList che ha lo scopo di restituire l'oggetto Subject a un indice specifico nell'elenco collegato. Per fare questo, ho usato un ListIterator. Vorrei creare un ListIterator in un determinato indice in LinkedList e utilizzare il metodo .next().

Tuttavia, il metodo .next() in un ListIterator restituisce solo un java.lang.Object, anche se desidero che restituisca un oggetto Subject.

Come si ottiene ListIterator.next() per restituire un oggetto Subject?

Ho provato downcasting a un soggetto, ma questo sembra fallire, e ho letto da qualche parte che non è possibile downcast oggetti non correlati.

Questa è la mia classe 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(); 
    } 
} 

Il metodo in questione è il metodo "getSubject()".

+0

in Java è la convenzione per iniziare nomi delle classi con un lettera maiuscola. Ciò rende anche più facile per le altre persone leggere il tuo codice. – extraneon

+0

Grazie per averlo indicato. – Joshua

+0

Perché in realtà hai bisogno di 'ListIterator'? Cosa c'è di sbagliato in 'List.get (index)' e 'List.remove (index)'? – whiskeysierra

risposta

5

è necessario dichiarare il vostro iteratore come:

private ListIterator<Subject> itr; 

Crea anche l'oggetto LinkedList come segue nel costruttore:

l = new LinkedList<Subject>(); 

Si potrebbe anche gettarlo ai Soggetto mentre tornava come la vostra lista solo i negozi Soggetto oggetto. Ma sarebbe meglio definire Iterator come detto prima.

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

Oltre al tuo problema, vedo il problema della convenzione di denominazione nel codice. È meglio seguirlo e fare una scia.

NOTA: ho apportato modifiche alla mia risposta dopo aver provato l'esempio in IDE Eclipse. Ti suggerirei di utilizzare IDE in quanto ti mostrerebbe anche un avviso su tali cose.

+0

Grazie per avermelo fatto notare ... non sapevo che le convenzioni di denominazione fossero così importanti>. < Nome classe modificato ora. – Joshua

4

È possibile utilizzare la genericità con il ListIterator.

private ListIterator<Subject> itr; 

Ora itr.next() soggetti di ritorno.

Risorse:

PS: Vi suggerisco di cambiare l'istanza del vostro LinkedList in l = new LinkedList<Subject>();

+0

Vale anche la pena notare che molti compilatori Java generano un avviso per "ListIterator privato itr;" sull'utilizzo di tipi non elaborati. –

+0

Oh dimenticati del nel costruttore ... Grazie! – Joshua

Problemi correlati