Дивно "[]" після підпису методу Java


119

Я сьогодні подивився якийсь код Java, і виявив якийсь дивний синтаксис:

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

Я подумав, що не можна компілювати, і хотів виправити те, що я вважав помилковим, але тоді я згадав компілятор Java насправді прийняв це!

Може хтось, будь ласка, допоможе мені зрозуміти, що це означає? Це масив функцій?


10
уа, це .. дивно ...; D
Нанна


2
Сама божевільна ... Річ, яку я коли-небудь бачив. Кажуть, в рубіні багато чарів, їж цей рубін!
IAdapter

16
Навіть не виглядає віддалено дивним порівняно з підписом функції, яка повертає вказівник на масив покажчиків на функції в C. :)
Кос

Відповіді:


111

Це метод, який повертає int[].

Специфікація мови Java (8.4. Декларації методу)

Для сумісності зі старими версіями платформи Java форма декларації для методу, який повертає масив, дозволяється розміщувати (деякі або всі) порожні дужки пар, які формують оголошення типу масиву після списку параметрів.

Це підтримується застарілим виробництвом:

MethodDeclarator :
    MethodDeclarator []

але не слід використовувати в новому коді.


92
Найкраще, що це є деякі чи всі . Тож якщо у вас є метод повернення тривимірного масиву ints, ви можете: public int[] foo()[][] {і зробити очі людей кровоточивими.
Кован

Я мушу сказати, що я сміюся вголос, відколи побачив цей код! :-D
sdlins

20

Це смішне запитання. У Java можна сказати int[] a;, як і int a[];.
З цього погляду, щоб отримати той самий результат, просто потрібно перемістити []
та написати public int[] get() {.
Все ще схоже, що код прийшов з обфускатора ...


2
Від обфускатора? Швидше за все, від програміста на C (ви не можете повернути масив, але вказівник на тип масиву - так .. і це буде схоже).
Кос

4
@Kos: Чому ви маєте на увазі, що обфускатор і програміст C мають бути дві різні речі? Багато разів їх немає!
Лій

10

Оскільки є тег C, я зазначу, що подібні (але не ідентичні) позначення можливі в C та C ++:

Тут функція fповертає вказівник на масив 10 ints.

int tab[10];

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

Java просто не потребує зірки та круглих дужок.


чи є простіший синтаксис функції, що повертає вказівник на n розмірний масив? (Не лише int *)
тед

Власне, я мушу додати, що ПКС підтримує безпосередньо f()[]щось на зразок (*f()).
AnArrayOfFunctions

4

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

int[] intArr = new int[0];

і також

int intArr[] = new int[0];

що виглядає більш привабливо, походить із синтаксису стилю c.

так само, за допомогою функції, ім'я може входити до або після [], а тип все ще є int []


1
Це мене дуже дратує, як це насправді повинно бути int [], оскільки факт, що це масив, є частиною типу, а не частиною назви його. Постград, що пише мої курси uni uni, весь час робить навпаки у своєму коді, це жахливо!
danpalmer

1
@danpalmer, я згоден, хоча покладіть себе на черевики програміста змінного струму, який миттєво має його в крові, щоб написати int ім'я []. у будь-якому випадку, це не така вже й велика справа, мова підтримує як і більшість програмістів Java, що використовують конвенцію int [], тому, крім роздратованого постграду чи двох його рідкісних. хто знає, це може спрацювати на вашу користь, якщо вони
поставлять
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.