Подтвердить что ты не робот

Строковый тип возвращаемого массива

Кто-нибудь видел массив [], помещенный после такой подписи метода?

public static String mySplit(String s)[] {
    return s.split(",");
}

public static void main(String... args) {
    String[] words = mySplit("a,b,c,d,e");
    System.out.println(Arrays.toString(words));
}

печатает

[a, b, c, d, e]

Раньше нечетные обозначения были для совместимости с "С", но я бы не подумал, что кто-то пишет это в С.

Кто-нибудь знает, почему это даже разрешено?

Я использую обновление 7 Java 7, если это имеет значение.

Это делает то же самое в Java 6. http://ideone.com/91rZV1


Кстати, это не компилируется, и я не ожидал, что он будет

public static <T> List mySplit(String s)<T> {
    return Collections.emptyList();
}
4b9b3361

Ответ 1

Кто-нибудь знает, почему это разрешено?

В этом случае это для обратной совместимости с самой Java. Из JLS раздел 8.4:

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

И да, вы действительно должны считать это мерзостью, которая не имеет никакой хорошей цели, кроме шока других разработчиков. На самом деле, вы могли бы использовать его, чтобы выиграть деньги на вечеринках, делая ставку на то, что он будет компилироваться, против людей, которые никогда его не видели...

Вот такой метод, который правомерные кодеры ожидали бы недействительными:

public String[] mwahahaha(String[] evil[])[] {
    return evil;
}

Ответ 2

Это нравится

  String[] a; 

совпадает с

  String a[];

То же самое работает для синтаксиса типов возвращаемых методов

  public static String mySplit(String s)[] {

совпадает с

  public static String[] mySplit(String s) {

Но я думаю, что я еще никогда не видел версию, упомянутую в продуктивном коде.

Ответ 3

Я думаю, что та же причина, по которой следующие объявления переменных эквивалентны

String[] array
String array[]

это то, что делают разработчики C, поэтому он был включен, чтобы помочь им.

Ответ 4

Я считаю, что он просто говорит Java, что возвращаемый тип представляет собой массив Strings, то же самое, что и объявление

static String[] mySplit(String s) {...

Аналогично объявлению переменных:

String myStringArray[];

эквивалентно

String[] myStringArray;

Ответ 5

Хороший вопрос; когда я реализовал парсер Java, я помню, что в настоящий момент я действительно запутался в грамматике JLS.

Чтобы развернуть ответ Джона, вот что происходит:

Есть (по крайней мере) 5 мест, где это имеет значение:

  • подписи типа метода
  • объявления локальной переменной
  • объявления полей
  • формальные параметры
  • for -loops

Здесь выдержка из грамматики, фокусирующаяся на объявлениях метода:

MethodOrFieldDecl:
    Type Identifier MethodOrFieldRest

MethodOrFieldRest:  
    FieldDeclaratorsRest ;
    MethodDeclaratorRest

MethodDeclaratorRest:
    FormalParameters {[]} [throws QualifiedIdentifierList] (Block | ;)

Type:
    BasicType {[]}
    ReferenceType  {[]}

(Предупреждение: трудно прочитать грамматику, потому что квадратные и фигурные скобки иногда являются литералами, а иногда и метасимволами.)

Это показывает, что [] может отображаться как в соответствии с правилом Type, так и как часть правила MethodDeclaratorRest. Он не является обязательным в обоих местах.

Ответ 6

Да, это разрешено,

та же причина, что:

String[] myArray;

эквивалентно

String myArray[];