72 votes

Type de retour de tableau étrange

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

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));
}

imprime

[a, b, c, d, e]

Dans le passé, les notations bizarres étaient destinées à assurer la compatibilité avec le langage "C", mais je n'imaginerais pas non plus que quelqu'un écrive ceci en langage "C".

Quelqu'un sait-il pourquoi cela est autorisé ?

J'utilise la mise à jour 10 de Java 7, au cas où cela aurait de l'importance.

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


BTW ceci ne compile pas, et je ne m'attendais pas à ce qu'il le fasse.

public static <T> List mySplit(String s)<T> {
    return Collections.emptyList();
}

90voto

Jon Skeet Points 692016

Quelqu'un sait-il pourquoi cela est autorisé ?

Dans ce cas, il s'agit d'une rétrocompatibilité avec Java lui-même. De la JLS section 8.4 :

Pour des raisons de compatibilité avec les anciennes versions de la plate-forme Java SE, la déclaration d'une méthode qui renvoie un tableau est autorisée à placer (tout ou partie) des paires de crochets vides qui forment la déclaration du type de tableau après la liste des paramètres formels. Ceci est supporté par la production obsolète suivante, mais ne doit pas être utilisé dans un nouveau code.

Et oui, vous devriez effectivement le considérer comme une abomination qui n'a d'autre but que de choquer les autres développeurs. En fait, vous pourriez l'utiliser pour gagner de l'argent dans des soirées en pariant qu'il compile, contre des gens qui ne l'ont jamais vu...

Voici le genre de méthode que les codeurs bien pensants s'attendraient à voir invalide :

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

19voto

MrSmith42 Points 5159

C'est comme si

  String[] a; 

est la même chose que

  String a[];

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

  public static String mySplit(String s)[] {

est la même chose que

  public static String[] mySplit(String s) {

Mais je pense que je n'ai pas encore vu la version que vous avez mentionnée dans le code productif.

6voto

Peter Elliott Points 2520

Je pense que c'est la même raison pour laquelle les déclarations de variables suivantes sont toutes deux équivalentes

String[] array
String array[]

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

4voto

iamnotmaynard Points 3440

Je crois que c'est juste pour dire à Java que le type de retour est un tableau de Strings c'est la même chose que de déclarer

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

Similaire à la déclaration de variables :

String myStringArray[];

est équivalent à

String[] myStringArray;

4voto

Matt Fenwick Points 17097

Bonne question ; lorsque j'ai implémenté un analyseur syntaxique Java, je me souviens avoir été très perturbé par la grammaire JLS à ce stade.

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

  • c'est ce qu'on appelle "notation mixte" dans la spécification
  • el grammaire sépare les déclarations de type en deux parties, chacune d'entre elles pouvant avoir 0 ou plusieurs [] s

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

  • signatures de types de méthodes
  • déclarations de variables locales
  • déclarations de champs
  • paramètres 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 crochets et les accolades sont parfois des littéraux et parfois des métacaractères).

Cela montre que [] peut apparaître à la fois sous le Type et dans le cadre de la MethodDeclaratorRest règle. Elle est facultative dans les deux endroits.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X