Seltsames "[]" nach Java-Methodensignatur

119

Ich habe mir heute Java-Code angesehen und eine seltsame Syntax gefunden:

public class Sample {
  public int get()[] {
    return new int[]{1, 2, 3};
  }
}

Ich dachte, das kann nicht kompiliert werden und wollte das beheben, was ich für einen Tippfehler hielt, aber dann erinnerte ich mich, dass der Java-Compiler es tatsächlich akzeptierte!

Kann mir bitte jemand helfen zu verstehen, was es bedeutet? Ist es eine Reihe von Funktionen?

Johannes Schaub - litb
quelle
10
woah, das ist ... seltsam ...; D
Nanne
2
Das Verrückteste ... was ich je gesehen habe. Sie sagen, Rubin hat viel Magie, essen Sie diesen Rubin!
IAdapter
16
Sieht im Vergleich zu einer Signatur einer Funktion, die einen Zeiger auf ein Array von Zeigern auf Funktionen in C zurückgibt, nicht einmal im entferntesten seltsam aus :) :)
Kos

Antworten:

111

Es ist eine Methode, die eine zurückgibt int[].

Java-Sprachspezifikation (8.4 Methodendeklarationen)

Aus Gründen der Kompatibilität mit älteren Versionen der Java-Plattform darf ein Deklarationsformular für eine Methode, die ein Array zurückgibt, (einige oder alle) leere Klammerpaare, die die Deklaration des Array-Typs bilden, nach der Parameterliste platzieren.

Dies wird durch die veraltete Produktion unterstützt:

MethodDeclarator :
    MethodDeclarator []

sollte aber nicht in neuem Code verwendet werden.

Mehrdad Afshari
quelle
92
Das Beste daran ist, dass es einige oder alle sind . Wenn Sie also eine Methode haben, die ein dreidimensionales Array von Ints zurückgibt, können Sie Folgendes tun: public int[] foo()[][] {und die Augen der Menschen bluten lassen.
Cowan
Ich muss sagen, dass ich laut lache, seit ich diesen Code gesehen habe! :-D
sdlins
20

Das ist eine lustige Frage. In Java kann man sagen int[] a;, sowie int a[];.
Aus dieser Perspektive müssen Sie nur das verschieben []
und schreiben , um das gleiche Ergebnis zu erzielen public int[] get() {.
Sieht immer noch so aus, als ob der Code von einem Verschleierer stammt ...

Costis Aivalis
quelle
2
Von einem Verschleierer? Wahrscheinlicher von einem C-Programmierer (Sie können kein Array zurückgeben, sondern einen Zeiger auf den Array-Typ - ja ... und es würde ähnlich aussehen).
Kos
4
@Kos: Warum implizieren Sie, dass ein Obfuscator und ein C-Programmierer zwei verschiedene Dinge sein müssen? Oft sind sie nicht!
Lii
10

Da es ein C-Tag gibt, möchte ich darauf hinweisen, dass eine ähnliche (aber nicht identische) Notation in C und C ++ möglich ist:

Hier gibt die Funktion feinen Zeiger auf ein Array von 10 Zoll zurück.

int tab[10];

int (*f())[10]
{
    return &tab;
}

Java braucht einfach keinen Stern und keine Klammer.

Ein Programmierer
quelle
Gibt es eine einfachere Syntax für eine Funktion, die einen Zeiger auf ein n-dimensionales Array zurückgibt? (Nicht nur ein int *)
ted
Eigentlich muss ich hinzufügen, pcc unterstützt direkt f()[]so etwas wie (*f()).
AnArrayOfFunctions
4

Die Java-Syntax ermöglicht Folgendes:

int[] intArr = new int[0];

und auch

int intArr[] = new int[0];

Das sieht eher nach der Syntax im C-Stil aus.

Bei einer Funktion kann der Name auch vor oder nach dem [] stehen, und der Typ ist immer noch int []

David
quelle
1
Das ärgert mich wirklich, da es eigentlich int [] sein sollte, weil die Tatsache, dass es sich um ein Array handelt, Teil des Typs ist, nicht Teil des Namens. Der Postgraduierte, der meine Uni-Java-Kursarbeiten schreibt, macht in seinem Code immer das Gegenteil, es ist schrecklich!
Danpalmer
1
@danpalmer, ich stimme zu, obwohl Sie sich in die Lage eines AC-Programmierers versetzen, der es in seinem Blut hat, int name [] zu schreiben. Trotzdem ist es keine so große Sache, die Sprache unterstützt beide und die meisten Java-Programmierer verwenden die int [] -Konvention, so dass es abgesehen von ein oder zwei nervigen Postgraduierten selten ist. Wer weiß, es könnte sogar zu Ihren Gunsten funktionieren, wenn sie eine Frage wie diese in Ihrem Finale stellen
David