Я изучал спецификацию языка 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 может быть определен только внутри класса или интерфейса верхнего уровня» ... какие-либо объяснения?