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?


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.


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 ...


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.


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 []


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.