2013-07-29 14 views
6

Wenn Sie eine Variable sind definiert, erscheint es durchaus gültig zu sein, um eine Variable zu deklarieren/definieren wie folgt:In Java, wann ist die Array-Abkürzung {a, b, c, ...} unpassend und warum?

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

Aber wenn Sie Wert sind Rückkehr, scheint es, als ungültig zu sein folgendes zu schreiben :

public double[] foo(){ 
     return {0,1,2} 
    } 

Ich hätte gedacht, dass intern beide die gleiche Aktion ausgeführt hätten. Zumindest ist Eclipse nicht einverstanden. Weiß jemand, was der Unterschied ist und wo er sonst gesehen werden kann, oder warum es nützlich wäre, das frühere Beispiel zu akzeptieren und das letztere abzulehnen?

Edit: okay, also ist es angebracht, wenn Sie initialisieren, aber ich sehe keine Mehrdeutigkeit ... konnte die JVM nicht den Typ der Variablen aus dem Namen der Variablen interpretieren (im Falle der Neudefinition bereits initialisierte Variablen) oder bei der Rückgabe (wobei die JVM nur den Rückgabetyp der Funktion betrachten könnte)? Was macht die Initialisierung zu einem Sonderfall einer Regel, die den impliziten Typ verbieten würde? Was macht die allgemeine Regel expliziten Typ?

Antwort

5

Es ist nur während einer Erklärung akzeptabel. Sie können jedoch verwenden.

JLS §10.6:

Ein Array Initialisierer kann in einer Erklärung angegeben werden, oder als Teil ein Array Schaffung Ausdruck.

Ein Array-Erstellungsausdruck ist die new double[] { }-Syntax.

+0

"Es ist nur während einer Deklaration akzeptabel." Warum? Warum nicht während einer Rückkehr Aussage? –

+0

@JohnP Weil die Sprache es nicht erlaubt. Soweit ich weiß, gibt es keinen guten Fall dagegen (ich denke, der Compiler muss vielleicht etwas mehr Typinferenz machen, um sicherzustellen, dass die Erstellung sicher ist). – Jeffrey

12

Sie können die geschweifte Schreibweise nur zum Zeitpunkt der Deklaration verwenden, wobei der Compiler den Typ des Arrays vom Deklarationstyp ableiten kann.

es dir sonstwo Array Creation Expression verwenden müssen, verwenden:

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

"Um es irgendwo anders zu verwenden, müssen Sie Array Creation Expression verwenden". Warum? Warum kann eine Return-Anweisung nicht die gleiche Notation verwenden? –

+0

@JohnP. Weil der Java Language Creator es so entworfen hat. Siehe [JLS Abschnitt 10.6] (http://docs.oracle.com/javase/specs/jls/se7/html/jls-10.html#jls-10.6). –

+0

Nein, das glaube ich nicht. Wenn ich fragen würde, warum Vögel Federn anstelle von Pelz entwickelten, dann würde das Sagen "weil der Schöpfer es so gemacht hat", bei weitem nicht befriedigend sein, oder? Ich akzeptiere Jeffreys Antwort eher, weil du betteltest. –