Странный «[]» после подписи метода Java

119

Сегодня я просмотрел код Java и обнаружил странный синтаксис:

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

Я думал, что это не может скомпилироваться, и хотел исправить то, что считал опечаткой, но потом вспомнил, что компилятор Java действительно принял это!

Может кто-нибудь помочь мне понять, что это значит? Это набор функций?

Йоханнес Шауб - litb
источник
10
ого, это .. странно ...; D
Nanne
6
см. комментарии к этому stackoverflow.com/questions/1995113/strangest-language-feature/…
josefx
2
Самая безумная ... вещь, которую я когда-либо видел. Говорят, в рубине много волшебства, съешьте этот рубин!
IAdapter
16
Даже отдаленно не выглядит странным по сравнению с сигнатурой функции, которая возвращает указатель на массив указателей на функции в C. :)
Кос

Ответы:

111

Это метод, возвращающий int[].

Спецификация языка Java (8.4 Объявления методов)

Для совместимости со старыми версиями платформы Java в форме объявления для метода, возвращающего массив, разрешено помещать (некоторые или все) пары пустых скобок, которые образуют объявление типа массива, после списка параметров.

Об этом говорит устаревшая продукция:

MethodDeclarator :
    MethodDeclarator []

но не следует использовать в новом коде.

Мехрдад Афшари
источник
92
Лучшее в этом то, что это часть или все . Итак, если у вас есть метод, возвращающий трехмерный массив целых чисел, вы можете сделать: public int[] foo()[][] {и заставить людей кровоточить.
Cowan
Должен сказать, что я громко смеюсь, когда увидел этот код! :-D
sdlins 05
20

Забавный вопрос. В java можно сказать int[] a;, а также int a[];.
С этой точки зрения, чтобы получить тот же результат, нужно просто переместить []
и написать public int[] get() {.
По-прежнему похоже, что код пришел из обфускатора ...

Костис Айвалис
источник
2
Из обфускатора? Скорее всего, от программиста на C (вы не можете вернуть массив, но указатель на тип массива - да ... и это будет выглядеть аналогично).
Кос,
4
@Kos: Почему ты имеешь в виду, что обфускатор и программист на C - это две разные вещи? Часто это не так!
Lii
10

Поскольку есть тег C, я отмечу, что похожая (но не идентичная) нотация возможна в C и C ++:

Здесь функция fвозвращает указатель на массив из 10 целых чисел.

int tab[10];

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

Java просто не нужны звездочка и круглые скобки.

AProgrammer
источник
есть ли более простой синтаксис для функции, возвращающей указатель на n-мерный массив? (Не только int *)
ted
Собственно, я должен добавить, что pcc поддерживает прямое f()[]значение чего-то вроде (*f()).
AnArrayOfFunctions
4

Синтаксис java позволяет:

int[] intArr = new int[0];

а также

int intArr[] = new int[0];

что выглядит более знакомо, исходя из синтаксиса в стиле c.

то же самое и с функцией, имя может стоять до или после [], а тип по-прежнему - int []

Дэвин
источник
1
Это действительно раздражает меня, поскольку это действительно должно быть int [], потому что тот факт, что это массив, является частью типа, а не частью его имени. Аспирант, который пишет мои учебные работы по uni java, все время делает противоположное в своем коде, это ужасно!
danpalmer
1
@danpalmer, я согласен, хотя поставьте себя на место программиста ac, у которого в крови всегда есть возможность написать int name []. в любом случае, это не такая уж большая проблема, язык поддерживает оба, и большинство Java-программистов используют соглашение int [], так что кроме раздражающих постграда или двух его редко. кто знает, возможно, это даже сработает в вашу пользу, если они
зададут