Type de retour de tableau étrange

Quelqu’un a-t-il vu le tableau [] placé après la signature de méthode comme ceci?

 public static Ssortingng mySplit(Ssortingng s)[] { return s.split(","); } public static void main(Ssortingng... args) { Ssortingng[] words = mySplit("a,b,c,d,e"); System.out.println(Arrays.toSsortingng(words)); } 

estampes

 [a, b, c, d, e] 

Dans le passé, les notations étranges ont été pour la compatibilité “C”, mais je n’imagine pas que quelqu’un écrive ceci en C non plus.

Est-ce que quelqu’un sait pourquoi c’est même permis?

J’utilise Java 7 Update 10, au cas où cela importerait.

Cela fait la même chose en Java 6. http://ideone.com/91rZV1


BTW cela ne comstack pas, et je ne m’attendrais pas à ce qu’il

 public static  List mySplit(Ssortingng s) { return Collections.emptyList(); } 

Est-ce que quelqu’un sait pourquoi c’est même permis?

Dans ce cas, c’est pour la compatibilité avec Java lui-même. De la section 8.4 de JLS :

Pour assurer la compatibilité avec les anciennes versions de la plate-forme Java SE, la déclaration d’une méthode renvoyant un tableau est autorisée à placer (certaines ou toutes) les paires de crochets vides qui constituent la déclaration du type de tableau après la liste de parameters formels. Ceci est soutenu par la production obsolète suivante, mais ne devrait pas être utilisé dans un nouveau code.

Et oui, vous devriez en effet considérer cela comme une abomination qui n’a pas d’autre but que de choquer d’autres développeurs. En fait, vous pourriez être en mesure de l’utiliser pour gagner de l’argent lors de parties en pariant que cela comstackrait, contre des gens qui ne l’ont jamais vu …

Voici le genre de méthode que les codeurs bien pensants s’attendaient à être invalide:

 public Ssortingng[] mwahahaha(Ssortingng[] evil[])[] { return evil; } 

C’est comme

  Ssortingng[] a; 

est le même que

  Ssortingng a[]; 

Même chose pour la syntaxe des types de retour de méthode

  public static Ssortingng mySplit(Ssortingng s)[] { 

est le même que

  public static Ssortingng[] mySplit(Ssortingng s) { 

Mais je pense que je n’ai jamais vu la version que vous avez mentionnée dans le code productif pour le moment.

Je pense que c’est la même raison que les déclarations de variables suivantes sont à la fois équivalentes

 Ssortingng[] array Ssortingng array[] 

C’est une chose que les développeurs C font, donc cela a été inclus pour les aider.

Je crois que c’est juste dire à Java que le type de retour est un tableau de Ssortingngs , identique à la déclaration

 static Ssortingng[] mySplit(Ssortingng s) {... 

Similaire à la déclaration de variables:

 Ssortingng mySsortingngArray[]; 

est équivalent à

 Ssortingng[] mySsortingngArray; 

Bonne question; Quand j’ai implémenté un parsingur Java, je me souviens que la grammaire JLS me rend vraiment confuse.

Pour développer la réponse de John, voici ce qui se passe:

  • c’est ce qu’on appelle la “notation mixte” dans la spécification
  • la grammaire rompt les déclarations de type en deux parties, chacune pouvant avoir 0 ou plus [] s

Il y a (au moins) 5 endroits où cela compte:

  • signatures de type de méthode
  • déclarations de variables locales
  • déclarations de terrain
  • parameters formels
  • for -loops

Voici un extrait de la grammaire, axé sur les déclarations de méthodes:

 MethodOrFieldDecl: Type Identifier MethodOrFieldRest MethodOrFieldRest: FieldDeclaratorsRest ; MethodDeclaratorRest MethodDeclaratorRest: FormalParameters {[]} [throws QualifiedIdentifierList] (Block | ;) Type: BasicType {[]} ReferenceType {[]} 

(Attention: il est difficile de lire la grammaire car les accolades sont parfois des littéraux et parfois des métacaractères.)

Cela montre que [] peut apparaître à la fois sous la règle Type et dans la règle MethodDeclaratorRest . Il est facultatif dans les deux endroits.

Oui, c’est permis,

même raison que:

 Ssortingng[] myArray; 

est équivalent à

 Ssortingng myArray[];