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.