Hat jemand das Array so gesehen, das []
nach der Methodensignatur platziert wurde?
public static String mySplit(String s)[] {
return s.split(",");
}
public static void main(String... args) {
String[] words = mySplit("a,b,c,d,e");
System.out.println(Arrays.toString(words));
}
druckt
[a, b, c, d, e]
In der Vergangenheit gab es ungerade Notationen für die "C" -Kompatibilität, aber ich würde mir nicht vorstellen, dass jemand dies in C schreibt.
Weiß jemand warum das überhaupt erlaubt ist?
Ich verwende Java 7 Update 10, falls es darauf ankommt.
Dies funktioniert auch in Java 6. http://ideone.com/91rZV1
Übrigens wird dies nicht kompiliert, und ich würde es auch nicht erwarten
public static <T> List mySplit(String s)<T> {
return Collections.emptyList();
}
java
arrays
syntax
declaration
Peter Lawrey
quelle
quelle
inx x[10]
genau das gleiche Problem ist, außer dass es weniger übertrieben isttoString
und hatstatic toString(String)
. Sie haben jedoch Recht - haben diesen Aufruf nicht bemerkt oder den Methodennamen als verdächtig empfunden.Antworten:
In diesem Fall dient dies der Abwärtskompatibilität mit Java. Aus dem JLS-Abschnitt 8.4 :
Und ja, Sie sollten es in der Tat als einen Gräuel betrachten, der keinen anderen Zweck hat, als andere Entwickler zu schockieren. Vielleicht können Sie damit Geld auf Partys gewinnen, indem Sie darauf wetten, dass es gegen Leute kompiliert wird, die es noch nie gesehen haben ...
Hier ist die Art von Methode, die von vernünftigen Codierern als ungültig erwartet wird:
public String[] mwahahaha(String[] evil[])[] { return evil; }
quelle
(String[]... evil[])
?Es ist wie
ist das gleiche wie
Gleiches gilt für die Syntax von Methodenrückgabetypen
public static String mySplit(String s)[] {
ist das gleiche wie
public static String[] mySplit(String s) {
Aber ich glaube, ich habe die Version, die Sie im Produktivcode erwähnt haben, noch nie gesehen.
quelle
Ich denke, es ist der gleiche Grund, warum die folgenden Variablendeklarationen beide gleichwertig sind
Dies ist eine Sache, die C-Entwickler tun, daher wurde sie aufgenommen, um ihnen zu helfen.
quelle
Ich glaube, es sagt Java nur, dass der Rückgabetyp ein Array von ist
Strings
, genau wie das Deklarierenstatic String[] mySplit(String s) {...
Ähnlich wie beim Deklarieren von Variablen:
ist äquivalent zu
quelle
Gute Frage; Als ich einen Java-Parser implementiert habe, erinnere ich mich, dass mich die JLS-Grammatik an dieser Stelle wirklich verwirrt hat.
Um Johns Antwort zu erweitern, gehen Sie wie folgt vor:
[]
s haben kannEs gibt (mindestens) 5 Stellen, an denen dies wichtig ist:
for
-schleifenHier ist ein Auszug aus der Grammatik, der sich auf Methodendeklarationen konzentriert:
MethodOrFieldDecl: Type Identifier MethodOrFieldRest MethodOrFieldRest: FieldDeclaratorsRest ; MethodDeclaratorRest MethodDeclaratorRest: FormalParameters {[]} [throws QualifiedIdentifierList] (Block | ;) Type: BasicType {[]} ReferenceType {[]}
(Warnung: Es ist schwierig, die Grammatik zu lesen, da die eckigen und geschweiften Klammern manchmal Literale und manchmal Metazeichen sind.)
Dies zeigt, dass
[]
dies sowohl unter derType
Regel als auch als Teil derMethodDeclaratorRest
Regel angezeigt werden kann. Es ist an beiden Stellen optional.quelle
Ja, das ist erlaubt,
der gleiche Grund, dass:
ist äquivalent zu
quelle