2010-08-22 12 views
70

Voglio avere due variabili di ciclo di diversi tipi. C'è un modo per farlo funzionare?Java: inizializzazione di più variabili in for init init?

@Override 
public T get(int index) throws IndexOutOfBoundsException { 
    // syntax error on first 'int' 
    for (Node<T> current = first, int currentIndex; current != null; 
      current = current.next, currentIndex++) { 
     if (currentIndex == index) { 
      return current.datum; 
     } 
    } 
    throw new IndexOutOfBoundsException(); 
} 
+0

Cosa è "prima"? Non è dichiarato da nessuna parte. È un membro della classe? – extraneon

+6

Dovresti accettare una risposta sotto –

+0

E a differenza di C, Java non ha l'operatore virgola: http://stackoverflow.com/questions/12601596/java-comma-operator-outside-for-loop-declaration, che consentirebbe di inizializzare (ma non dichiarare) due variabili di tipi diversi. –

risposta

6

basta spostare dichiarazioni di variabili (Node<T> current, int currentIndex) fuori del ciclo e dovrebbe funzionare. Qualcosa di simile

int currentIndex; 
Node<T> current; 
for (current = first; current != null; current = current.next, currentIndex++) { 

o forse anche

int currentIndex; 
for (Node<T> current = first; current != null; current = current.next, currentIndex++) { 
+1

Nessuna compilazione: è necessario inizializzare le variabili prima dell'uso. – unbeli

+0

@unbeli beh, non stavo esercitando in compilazione di codice manuale :) Volevo solo dare l'idea. –

+2

@unbeli: giusto per chiarire: currentIndex deve essere inizializzato. La prima cosa che Nikita fa è "currentIndex ++", che fa sorgere spontaneamente la domanda, incrementare cosa? la corrente va bene perché il primo utilizzo è impostarlo per primo. – Jay

14

Non è possibile come questo. O si utilizzano più variabili dello stesso tipo for(Object var1 = null, var2 = null; ...) oppure si estrae l'altra variabile e la si dichiara prima del ciclo for.

84

La dichiarazione initialization of a for segue le regole per local variable declarations.

Questo sarebbe legale (se sciocco):

for (int a = 0, b[] = { 1 }, c[][] = { { 1 }, { 2 } }; a < 10; a++) { 
    // something 
} 

Ma cercando di dichiarare le distinte Node e int tipi come si desidera non è legale per le dichiarazioni delle variabili locali.

È possibile limitare l'ambito di ulteriori variabili all'interno dei metodi utilizzando un blocco come questo:

{ 
    int n = 0; 
    for (Object o = new Object();/* expr */;/* expr */) { 
    // do something 
    } 
} 

Questo assicura che non riutilizzare accidentalmente la variabile altrove nel metodo.

+7

Qualcuno ha idea del motivo per cui i progettisti linguistici hanno implementato questo vincolo apparentemente non necessario? –

+0

@glenviewjeff: sarebbe meglio chiedere una domanda separata. – McDowell

+0

@JeffAxelrod, forse per ragioni storiche perché Java è stato modellato dopo C++ ... vedi questo post: http://stackoverflow.com/questions/2687392/is-it-possible-to-declare-two-variables-of-different -types-in-a-for-loop –