2009-11-25 17 views
11

ho provato qualcosa di simile:array Initialize utilizzando operatore ternario

 

boolean funkyBoolean = true; 
int array[] = funkyBoolean ? {1,2,3} : {4,5,6}; 
 

Ma questo codice non sarà nemmeno la compilazione. C'è qualche spiegazione per questo? non è funkyBoolean ? {1,2,3} : {4,5,6} un'espressione valida? grazie in anticipo!

risposta

27

È possibile utilizzare solo il {1, 2, 3} sintassi in situazioni molto limitate, e questo non è uno di loro. Prova questo:

int array[] = funkyBoolean ? new int[]{1,2,3} : new int[]{4,5,6}; 

A proposito, buon stile Java è quello di scrivere la dichiarazione come:

int[] array = ... 

EDIT: Per la cronaca, la ragione che {1, 2, 3} è così limitato è che il suo tipo è ambiguo . In teoria potrebbe essere un array di interi, long, float, ecc. Inoltre, la grammatica Java come definita dal JLS lo proibisce, quindi è così.

+0

Grazie per la spiegazione Stephen! – marcosbeirigo

+0

In JDK7 sembra che '{1, 2, 3}' (in altre situazioni) sia un insieme, con tipo determinato dalla tipizzazione di destinazione (come metodi generici, come 'Arrays.asList'). –

+0

Solo per la cronaca, la modifica della lingua proposta a cui il commento di Tom allude non è stata apportata a JDK 7. –

5
boolean funkyBoolean = true; 
int[] array = funkyBoolean ? new int[]{1,2,3} : new int[]{4,5,6}; 
3

Un inizializzatore matrice può essere specificato in una dichiarazione, o come parte di un'espressione creazione array (§15.10), creando un array e fornendo alcuni valori iniziali

Questo è ciò che il Java Spec dice (10.6). Quindi la versione "breve" (con l'espressione di creazione) è consentita solo nelle dichiarazioni (int[] a = {1,2,3};), in tutti gli altri casi è necessario un costrutto new int[]{1,2,3}, se si desidera utilizzare l'inizializzatore.

+0

Grazie, è stato utile! – marcosbeirigo