Estranho "[]" após a assinatura do método Java

119

Eu olhei para algum código Java hoje e encontrei uma sintaxe estranha:

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

Eu pensei que não era possível compilar e queria consertar o que eu pensava ser um erro de digitação, mas lembrei que o compilador Java realmente o aceitava!

Alguém pode me ajudar a entender o que isso significa? É uma matriz de funções?

Johannes Schaub - litb
fonte
10
woah, isso é .. estranho ...; D
Nanne 15/01
2
O mais louco ... coisa que eu já vi. Dizem que rubi tem muita magia, coma esse rubi!
precisa saber é o seguinte
16
Nem sequer olha remotamente estranho em comparação com uma assinatura de uma função que retorna um ponteiro para array de ponteiros para funções em C. :)
Kos

Respostas:

111

É um método que retorna um int[].

Especificação da linguagem Java (declarações do método 8.4)

Para compatibilidade com versões mais antigas da plataforma Java, é permitido que um formulário de declaração para um método que retorne uma matriz coloque (alguns ou todos) os pares de colchetes vazios que formam a declaração do tipo de matriz após a lista de parâmetros.

Isso é suportado pela produção obsoleta:

MethodDeclarator :
    MethodDeclarator []

mas não deve ser usado em novo código.

Mehrdad Afshari
fonte
92
A melhor parte disso é que é parte ou a totalidade . Portanto, se você tem um método para retornar uma matriz tridimensional de ints, pode fazê-lo: public int[] foo()[][] {e fazer os olhos das pessoas sangrarem.
Cowan
Devo dizer que estou rindo alto desde que vi esse código! :-D
sdlins
20

Essa é uma pergunta engraçada. Em java, você pode dizer int[] a;, assim como int a[];.
Nesta perspectiva, para obter o mesmo resultado, basta mover o []
e escrever public int[] get() {.
Ainda parece que o código veio de um ofuscador ...

Costis Aivalis
fonte
2
De um ofuscador? Provavelmente de um programador C (você não pode retornar uma matriz, mas um ponteiro para o tipo de matriz - sim ... e seria semelhante).
Kos
4
@ Kos: Por que você está insinuando que um ofuscador e um programador C devem ser duas coisas diferentes? Muitas vezes não são!
Lii 03/01
10

Como existe uma tag C, mostrarei que uma notação semelhante (mas não idêntica) é possível em C e C ++:

Aqui, a função fretorna um ponteiro para uma matriz de 10 polegadas.

int tab[10];

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

Java simplesmente não precisa de estrela e parênteses.

AProgrammer
fonte
existe uma sintaxe mais fácil para uma função retornando um ponteiro para uma matriz n dimensional? (Não apenas um int *)
ted
Na verdade, devo acrescentar, o pcc suporta diretamente o que f()[]significa algo parecido (*f()).
AnArrayOfFunctions
4

A sintaxe do java permite o seguinte:

int[] intArr = new int[0];

e também

int intArr[] = new int[0];

que parece mais familiar vindo da sintaxe do estilo c.

também, com uma função, o nome pode vir antes ou depois do [] e o tipo ainda é int []

davin
fonte
1
Isso realmente me incomoda, pois realmente deveria ser int [] porque o fato de ser uma matriz faz parte do tipo, não parte do nome dela. O pós-graduado que escreve meus cursos uni java faz o oposto o tempo todo em seu código, é horrível!
danpalmer
1
@danpalmer, eu concordo, embora você se coloque no lugar de um programador de CA, que inatamente tem no sangue para escrever int name []. de qualquer maneira, não é um problema, a linguagem suporta ambos e a maioria dos programadores de java usa a convenção int [], portanto, além de um pós-graduação irritante ou dois, é raro. quem sabe, pode até funcionar em seu favor se fazer uma pergunta como esta em sua última
davin