Dziwne „[]” po podpisie metody Java

119

Przyjrzałem się dzisiaj kodowi Java i znalazłem dziwną składnię:

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

Pomyślałem, że nie może się skompilować i chciałem naprawić to, co uważałem za literówkę, ale potem przypomniałem sobie, że kompilator Java faktycznie to zaakceptował!

Czy ktoś może mi pomóc zrozumieć, co to znaczy? Czy jest to tablica funkcji?

Johannes Schaub - litb
źródło
10
woah, to ... dziwne ...; D
Nanne
2
Najbardziej szalona ... rzecz, jaką kiedykolwiek widziałem. Mówią, że rubin ma dużo magii, zjedz ten rubin!
IAdapter
16
Nie wygląda to nawet trochę dziwnie w porównaniu z sygnaturą funkcji, która zwraca wskaźnik do tablicy wskaźników do funkcji w C. :)
Kos

Odpowiedzi:

111

Jest to metoda, która zwraca int[].

Specyfikacja języka Java (deklaracje metod 8.4)

W celu zapewnienia zgodności ze starszymi wersjami platformy Java, formularz deklaracji metody zwracającej tablicę może umieszczać (niektóre lub wszystkie) puste pary nawiasów, które tworzą deklarację typu tablicy po liście parametrów.

Potwierdza to przestarzała produkcja:

MethodDeclarator :
    MethodDeclarator []

ale nie powinno być używane w nowym kodzie.

Mehrdad Afshari
źródło
92
Najlepsze w tym wszystkim jest to, że jest to część lub całość . Więc jeśli masz metodę zwracającą trójwymiarową tablicę int, możesz to zrobić: public int[] foo()[][] {i sprawić, że ludzie zaczną krwawić.
Cowan
Muszę powiedzieć, że śmieję się głośno, odkąd zobaczyłem ten kod! :-D
sdlins
20

To zabawne pytanie. W javie możesz powiedzieć int[] a;, jak również int a[];.
Z tej perspektywy, aby uzyskać ten sam wynik wystarczy przesunąć []
i napisać public int[] get() {.
Wciąż wygląda na to, że kod pochodzi z obfuskatora ...

Costis Aivalis
źródło
2
Od obfuskatora? Bardziej prawdopodobne od programisty C (nie możesz zwrócić tablicy, ale wskaźnik do typu tablicy - tak ... i wyglądałoby podobnie).
Kos
4
@Kos: Dlaczego sugerujesz, że obfuskator i programista C muszą to być dwie różne rzeczy? Wiele razy tak nie jest!
Lii,
10

Ponieważ istnieje znacznik C, zwrócę uwagę, że podobny (ale nie identyczny) zapis jest możliwy w C i C ++:

Tutaj funkcja fzwraca wskaźnik do tablicy 10 liczb całkowitych.

int tab[10];

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

Java po prostu nie potrzebuje gwiazdy i nawiasów.

AProgrammer
źródło
czy istnieje prostsza składnia funkcji zwracającej wskaźnik do tablicy n-wymiarowej? (Nie tylko int *)
ted
Właściwie muszę dodać, że pcc obsługuje bezpośrednio f()[]coś takiego (*f()).
AnArrayOfFunctions
4

składnia java pozwala na:

int[] intArr = new int[0];

i również

int intArr[] = new int[0];

co wygląda bardziej znajomo ze składni w stylu c.

tak więc w przypadku funkcji nazwa może występować przed lub po [], a typ to nadal int []

davin
źródło
1
To naprawdę mnie denerwuje, ponieważ naprawdę powinno być int [], ponieważ fakt, że jest to tablica, jest częścią typu, a nie częścią jego nazwy. Postgrad, który pisze moje prace na zajęciach z uni java, cały czas robi w swoim kodzie odwrotnie, to okropne!
danpalmer
1
@danpalmer, zgadzam się, chociaż postaw się w sytuacji programisty ac, który z natury ma we krwi napisać int name []. w każdym razie, to nie jest taka wielka sprawa, język obsługuje oba języki, a większość programistów Java używa konwencji int [], więc poza irytującym postgrad lub dwoma jest rzadkością. kto wie, może to nawet zadziałać na twoją korzyść, jeśli
zadadzą