Bizarre «[]» après la signature de la méthode Java

119

J'ai regardé du code Java aujourd'hui et j'ai trouvé une syntaxe étrange:

public class Sample {
  public int get()[] {
    return new int[]{1, 2, 3};
  }
}

Je pensais que cela ne pouvait pas être compilé et je voulais corriger ce que je pensais être une faute de frappe, mais je me suis souvenu que le compilateur Java l'avait effectivement accepté!

Quelqu'un peut-il m'aider s'il vous plaît à comprendre ce que cela signifie? S'agit-il d'un ensemble de fonctions?

Johannes Schaub - litb
la source
10
woah, c'est .. étrange ...; D
Nanne
2
La chose la plus folle que j'aie jamais vue. Ils disent que le rubis a beaucoup de magie, mange ce rubis!
IAdapter
16
Cela n'a même pas l'air étrange à distance comparé à une signature d'une fonction qui renvoie un pointeur vers un tableau de pointeurs vers des fonctions en C. :)
Kos

Réponses:

111

C'est une méthode qui renvoie un int[].

Spécification du langage Java (déclarations de méthode 8.4)

Pour assurer la compatibilité avec les anciennes versions de la plate-forme Java, un formulaire de déclaration pour une méthode qui renvoie un tableau est autorisé à placer (tout ou partie) les paires de crochets vides qui forment la déclaration du type de tableau après la liste de paramètres.

Ceci est soutenu par la production obsolescente:

MethodDeclarator :
    MethodDeclarator []

mais ne doit pas être utilisé dans un nouveau code.

Mehrdad Afshari
la source
92
Le meilleur dans tout cela est que c'est tout ou partie de . Donc, si vous avez une méthode renvoyant un tableau en trois dimensions d'entiers, vous pouvez faire: public int[] foo()[][] {et faire saigner les yeux des gens.
Cowan
Je dois dire que je ris aux éclats depuis que j'ai vu ce code! :-D
sdlins
20

C'est une drôle de question. En java, vous pouvez dire int[] a;, ainsi que int a[];.
De ce point de vue, pour obtenir le même résultat, il suffit de déplacer []
et d'écrire public int[] get() {.
On dirait toujours que le code provient d'un obfuscateur ...

Costis Aivalis
la source
2
D'un obfuscateur? Plus probablement d'un programmeur C (vous ne pouvez pas retourner un tableau, mais un pointeur vers le type de tableau - oui .. et cela aurait l'air similaire).
Kos
4
@Kos: Pourquoi insinuez-vous qu'un obfuscateur et un programmeur C doivent être deux choses différentes? Souvent, ils ne le sont pas!
Lii
10

Comme il existe une balise C, je précise qu'une notation similaire (mais pas identique) est possible en C et C ++:

Ici, la fonction frenvoie un pointeur vers un tableau de 10 pouces.

int tab[10];

int (*f())[10]
{
    return &tab;
}

Java n'a tout simplement pas besoin de l'étoile et des parenthèses.

AProgrammeur
la source
existe-t-il une syntaxe plus simple pour une fonction renvoyant un pointeur vers un tableau à n dimensions? (Pas seulement un int *)
ted
En fait, je dois ajouter que pcc prend en charge directement f()[]quelque chose comme (*f()).
AnArrayOfFunctions
4

La syntaxe de java permet ce qui suit:

int[] intArr = new int[0];

et aussi

int intArr[] = new int[0];

qui semble plus familier provenant de la syntaxe de style c.

de même, avec une fonction, le nom peut venir avant ou après le [], et le type est toujours int []

Davin
la source
1
Cela m'ennuie vraiment car il devrait vraiment être int [] car le fait que ce soit un tableau fait partie du type, pas du nom de celui-ci. Le postgrad qui écrit mes cours d'uni java fait tout le temps le contraire dans son code, c'est horrible!
danpalmer
1
@danpalmer, je suis d'accord, mais mettez-vous dans la peau d'un programmeur ac qui a hâte d'écrire int name []. de toute façon, ce n'est pas si grave, le langage supporte les deux et la plupart des programmeurs java utilisent la convention int [], donc à part un postgrad ennuyeux ou deux, c'est rare. qui sait, cela pourrait même jouer en votre faveur s'ils posent une question comme celle-ci lors de votre finale
davin