Strano "[]" dopo la firma del metodo Java


119

Oggi ho guardato un po 'di codice Java e ho trovato una sintassi strana:

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

Pensavo che non fosse possibile compilare e volevo correggere quello che pensavo fosse un errore di battitura, ma poi mi sono ricordato che il compilatore Java lo ha effettivamente accettato!

Qualcuno può aiutarmi a capire cosa significa? È una serie di funzioni?


10
woah, è .. strano ...; D
Nanne


2
La cosa più pazza che abbia mai visto. Dicono che il rubino abbia molta magia, mangia quel rubino!
IAdapter

16
Non sembra nemmeno lontanamente strano rispetto a una firma di una funzione che restituisce un puntatore a un array di puntatori a funzioni in C. :)
Kos

Risposte:


111

È un metodo che restituisce un file int[].

Specifica del linguaggio Java (8.4 dichiarazioni di metodo)

Per compatibilità con le versioni precedenti della piattaforma Java, un modulo di dichiarazione per un metodo che restituisce un array può posizionare (alcune o tutte) le coppie di parentesi vuote che formano la dichiarazione del tipo di array dopo l'elenco dei parametri.

Questo è supportato dalla produzione obsoleta:

MethodDeclarator :
    MethodDeclarator []

ma non dovrebbe essere utilizzato nel nuovo codice.


92
La parte migliore di questo è che è tutto o in parte . Quindi, se hai un metodo che restituisce una matrice tridimensionale di int, puoi fare: public int[] foo()[][] {e far sanguinare gli occhi delle persone.
Cowan

Devo dire che sto ridendo a crepapelle da quando ho visto quel codice! :-D
sdlins

20

Questa è una domanda divertente. In java puoi dire int[] a;, oltre aint a[]; .
Da questa prospettiva, per ottenere lo stesso risultato basta spostare il []
e scrivere public int[] get() {.
Sembra ancora che il codice provenga da un offuscatore ...


2
Da un offuscatore? Più probabilmente da un programmatore C (non puoi restituire un array, ma un puntatore al tipo di array - sì .. e sarebbe simile).
Kos

4
@Kos: Perché insinui che un offuscatore e un programmatore C debbano essere due cose diverse? Molte volte non lo sono!
Lii

10

Poiché esiste un tag C, farò notare che una notazione simile (ma non identica) è possibile in C e C ++:

Qui la funzione frestituisce un puntatore a un array di 10 int.

int tab[10];

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

Java semplicemente non ha bisogno della stella e delle parentesi.


esiste una sintassi più semplice per una funzione che restituisce un puntatore a un array n dimensionale? (Non solo un int *)
ted

In realtà, devo aggiungere, pcc supporta direttamente il f()[]significato di qualcosa di simile (*f()).
AnArrayOfFunctions

4

La sintassi di java consente quanto segue:

int[] intArr = new int[0];

e anche

int intArr[] = new int[0];

che sembra più familiare derivante dalla sintassi in stile C.

così anche, con una funzione, il nome può essere prima o dopo [] e il tipo è ancora int []


1
Questo mi infastidisce davvero perché dovrebbe essere int [] perché il fatto che sia un array fa parte del tipo, non del nome di esso. Il postgrad che scrive i miei corsi uni java fa sempre l'opposto nel suo codice, è orribile!
danpalmer

1
@danpalmer, sono d'accordo, anche se mettiti nei panni di un programmatore di CA che ha in fondo nel sangue di scrivere int name []. comunque, non è un grosso problema, il linguaggio supporta entrambi e la maggior parte dei programmatori java usa la convenzione int [], quindi a parte un fastidioso postgrad o due è raro. chissà, potrebbe anche funzionare a tuo favore se ti fanno una domanda come questa nella tua finale
davin
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.