Extraño "[]" después de la firma del método Java

119

Hoy miré algo de código Java y encontré una sintaxis extraña:

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

Pensé que no se puede compilar y quería corregir lo que pensé que era un error tipográfico, ¡pero luego recordé que el compilador de Java realmente lo aceptó!

¿Puede alguien ayudarme a entender lo que significa? ¿Es una serie de funciones?

Johannes Schaub - litb
fuente
10
woah, eso es ... extraño ...; D
Nanne
2
La cosa más loca ... que he visto. Dicen que el rubí tiene mucha magia, ¡cómete ese rubí!
IAdapter
16
Ni siquiera parece remotamente extraño en comparación con la firma de una función que devuelve un puntero a una matriz de punteros a funciones en C. :)
Kos

Respuestas:

111

Es un método que devuelve un int[].

Especificación del lenguaje Java (8.4 Declaraciones de métodos)

Para compatibilidad con versiones anteriores de la plataforma Java, un formulario de declaración para un método que devuelve una matriz puede colocar (algunos o todos) los pares de corchetes vacíos que forman la declaración del tipo de matriz después de la lista de parámetros.

Esto está respaldado por la producción obsoleta:

MethodDeclarator :
    MethodDeclarator []

pero no debe usarse en código nuevo.

Mehrdad Afshari
fuente
92
Lo mejor de esto es que es parte o la totalidad . Entonces, si tiene un método que devuelve una matriz tridimensional de ints, puede hacer: public int[] foo()[][] {y hacer sangrar los ojos de las personas.
Cowan
¡Tengo que decir que me estoy riendo a carcajadas desde que vi ese código! :-D
sdlins
20

Esa es una pregunta divertida. En Java se puede decir int[] a;, así como int a[];.
Desde esta perspectiva, para obtener el mismo resultado solo es necesario mover []
y escribir public int[] get() {.
Todavía parece que el código proviene de un ofuscador ...

Costis Aivalis
fuente
2
¿De un ofuscador? Es más probable que provenga de un programador de C (no puede devolver una matriz, sino un puntero al tipo de matriz, sí ... y se vería similar).
Kos
4
@Kos: ¿Por qué insinúa que un ofuscador y un programador en C deben ser dos cosas diferentes? ¡Muchas veces no lo son!
Lii
10

Como hay una etiqueta C, señalaré que una notación similar (pero no idéntica) es posible en C y C ++:

Aquí la función fdevuelve un puntero a una matriz de 10 ints.

int tab[10];

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

Java simplemente no necesita la estrella y el paréntesis.

Un programador
fuente
¿Existe una sintaxis más sencilla para una función que devuelve un puntero a una matriz de n dimensiones? (No solo un int *)
ted
En realidad, debo agregar, pcc admite directamente f()[]significar algo como (*f()).
AnArrayOfFunctions
4

La sintaxis de Java permite lo siguiente:

int[] intArr = new int[0];

y también

int intArr[] = new int[0];

que parece más fmiliar viniendo de la sintaxis de estilo C.

también, con una función, el nombre puede ir antes o después de [], y el tipo sigue siendo int []

davin
fuente
1
Esto realmente me molesta, ya que debería ser int [] porque el hecho de que sea una matriz es parte del tipo, no parte del nombre. El postgrado que escribe mis cursos de uni java hace todo el tiempo lo contrario en su código, ¡es horrible!
danpalmer
1
@danpalmer, estoy de acuerdo, aunque ponte en la piel de un programador de corriente alterna que de manera inapropiada tiene en la sangre escribir int name []. de todos modos, no es tan importante, el lenguaje soporta ambos y la mayoría de los programadores de Java usan la convención int [], así que aparte de un postgrado molesto o dos, es raro. quién sabe, incluso podría funcionar a su favor si hacen una pregunta como esta en su final
David