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?


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.


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 ...


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.


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 []


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ą
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.