2013-07-29 10 views
6

Se si sta definendo una variabile, sembra essere perfettamente valido per dichiarare/definire una variabile come segue:In Java, quando l'array {a, b, c, ...} è inappropriato, e perché?

double[][] output = {{0,0},{1,0}}; 

Ma se si sta restituendo un valore, sembra non essere valido per scrivere il seguente :

Avrei pensato che internamente entrambi avrebbero eseguito la stessa azione. Per lo meno, Eclipse non è d'accordo. Qualcuno sa qual è la differenza, e dove può essere visto altrimenti, o perché sarebbe utile accettare l'esempio precedente e respingere quest'ultimo?

Modifica: ok, quindi è opportuno quando si sta inizializzando, ma non vedo alcuna ambiguità ... la JVM non potrebbe interpretare il tipo di variabile dal nome della variabile (nel caso di ridefinizione variabili già inizializzate) o al momento del ritorno (in cui la JVM potrebbe solo guardare il tipo di ritorno della funzione)? Cosa rende l'inizializzazione un caso speciale di una regola che proibisce il tipo implicito? Ciò che rende la regola generale richiede un tipo esplicito?

risposta

5

E 'accettabile solo nel corso di una dichiarazione. Tuttavia, è possibile utilizzare new double[] {0, 1, 2}.

JLS §10.6:

Un inizializzatore dell'array può essere specificata in una dichiarazione, o come parte di una creazione espressione matrice.

Un'espressione di creazione di array è la sintassi new double[] { }.

+0

"È accettabile solo durante una dichiarazione." Perché? Perché non durante una dichiarazione di reso? –

+0

@JohnP Perché la lingua non lo consente. Per quanto ne so, non ci sono buone ragioni contro di esso (suppongo che il compilatore potrebbe dover fare un po 'più di inferenza di tipo per garantire che la creazione sia sicura). – Jeffrey

12

È possibile utilizzare la notazione di parentesi solo nel punto di dichiarazione, in cui il compilatore può inferire il tipo di matrice dal tipo di dichiarazione.

di usarlo in qualsiasi altro luogo è necessario utilizzare Array Creation Expression:

return new double[] {0,1,2}; 
+0

"Per utilizzarlo in qualsiasi altro luogo è necessario utilizzare l'espressione di creazione di array". Perché? Perché una dichiarazione di reso non può usare la stessa notazione? –

+0

@JohnP. Perché, il Java Language Creator lo ha progettato in questo modo. Vedi [Sezione JLS 10.6] (http://docs.oracle.com/javase/specs/jls/se7/html/jls-10.html#jls-10.6). –

+0

No, non la penso così. Se chiedessi perché gli uccelli hanno sviluppato piume invece di pelliccia, dire "perché il creatore ha fatto così" non sarebbe affatto soddisfacente, giusto? Sono più propenso ad accettare la risposta di Jeffrey solo perché hai pregato. –