Я изучал спецификацию языка Java здесь (вместо этого я должен выпить пива), и мне интересно, что может содержать метод. Спецификация заявляет, что тело метода может содержать блок
MethodBody:
Block
Где «Блок» содержит «BlockStatements». Правило BlockStatement выглядит следующим образом:
BlockStatement :
LocalVariableDeclarationStatement
ClassOrInterfaceDeclaration
[Identifier :] Statement
Я могу понять 'LocalVariableDeclarationStatement', который может быть
[final] int x, y, z;
Однако я не понимаю , почему существует правило ClassOrInterfaceDeclaration. Это правило выглядит так:
ClassOrInterfaceDeclaration:
ModifiersOpt (ClassDeclaration | InterfaceDeclaration)
ClassDeclaration:
class Identifier [extends Type] [implements TypeList] ClassBody
InterfaceDeclaration:
interface Identifier [extends TypeList] InterfaceBody
Что здесь происходит - Вы не можете точно объявить класс или интерфейс внутри блока?
Может кто-нибудь помочь объяснить эту путаницу, пожалуйста?
Обновление : я могу определить класс в методе, но следующее не будет работать:
public class Foo {
public void doFoo() {
interface dooJa {
int bar();
}
}
}
Компилятор жалуется, заявляя, что "членский интерфейс dooJa может быть определен только внутри класса или интерфейса верхнего уровня" ... какие-либо объяснения?