Что означают квадратные скобки в объявлениях методов Java?

Грамматика для объявлений методов в Java выглядит примерно так:

Объявление метода Java BNF:

method_declaration 
    ::= 
    { modifier } type identifier 
    "(" [ parameter_list ] ")" { "[" "]" } 
    ( statement_block | ";" ) 

И мне интересно, что означают квадратные скобки.

  1. Может ли кто-нибудь привести мне пример?
  2. Объявления методов в Java выглядят так, как показано выше (как насчет дженериков)?
  3. Где я могу найти полную и актуальную грамматику BNF для Java?

person midas    schedule 23.03.2013    source источник
comment
Ваша связанная страница с 1996 года ... давным-давно и сомнительный источник   -  person PeterMmm    schedule 23.03.2013
comment
Я знаю, так где я могу найти полную и актуальную грамматику BNF для Java?   -  person midas    schedule 23.03.2013
comment
Единственный действительный источник: docs.oracle.com/javase. /specs/jls/se7/html/jls-18.html   -  person PeterMmm    schedule 23.03.2013


Ответы (5)


Квадратные скобки указывают, что метод возвращает массив. Например, вы можете написать метод, который возвращает массив int как:

int method()[] { … }

Однако многие люди не знакомы с этим синтаксисом, и его лучше избегать.

Здесь вы найдете полный синтаксис для java 7: http://docs.oracle.com/javase/specs/jls/se7/html/jls-18.html

person Joni    schedule 23.03.2013
comment
и таким образом: method_declaration ::= { модификатор } type { [ ] } идентификатор ( [ список_параметров ] ) { [ ] } ( блок_операторов | ; ) - person PeterMmm; 23.03.2013
comment
Это лишнее, Питер; возвращаемый тип уже позволяет указать тип массива. - person Joni; 23.03.2013

Это устаревшая конструкция. Из JLS (§8.4. Объявления методов ):

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

MethodDeclarator:
     MethodDeclarator [ ]

Таким образом, это допустимая Java (хотя я никогда не видел, чтобы эта конструкция использовалась в реальном коде).

Что касается грамматики, которую вы цитируете, она кажется неполной. Например, кажется, что он не включает необязательное предложение throws. Кроме того, он допускает только одну пару квадратных скобок в method_declaration, тогда как официальная грамматика допускает любое количество таких пар.

Полным справочником является Спецификация языка Java, Глава 18. Синтаксис .

person NPE    schedule 23.03.2013

{ ... } означает 0..* (ноль раз или больше)

Дженерики отсутствуют, потому что документу, на который вы ссылаетесь, 17 лет.

В официальной Спецификации языка Java используется следующий синтаксис: http://docs.oracle.com/javase/specs/jls/se7/html/jls-2.html#jls-2.4

Мне не удалось найти настоящую грамматику BNF для Java, которая была бы менее устаревшей, чем ваша.

person gd1    schedule 23.03.2013

Скобки используются для возвращаемых типов, являющихся массивами, например:

Sting myMethodThatRetrunsStringArray[] {
//Implementation
// return a String array
}
person Amar    schedule 23.03.2013

мы говорим, что токен } находится справа от токена {, несмотря на то, что в этом двумерном представлении он появляется внизу и слева от токена {. Это соглашение об использовании слов left и right позволяет нам говорить, например, о правом операнде бинарного оператора или о левой части присваивания.

http://docs.oracle.com/javase/specs/jls/se7/html/jls-2.html

http://docs.oracle.com/javase/specs/jls/se7/html/jls-3.html

person Suresh Atta    schedule 23.03.2013