Выражение создания экземпляра локального класса в статическом контексте
JLS 15.9.2 говорит нам, как определить включающий экземпляр: пусть C будет создаваемым экземпляром класса, и пусть i будет создаваемым экземпляром.
Если C является внутренним классом, то у меня может быть непосредственно включающий экземпляр (§8.1.3), определенный следующим образом:
[...]
Если C является локальным классом, то:
Если C происходит в статическом контексте, то у меня нет немедленно включающего экземпляра.
В противном случае, если выражение создания экземпляра класса происходит в статическом контексте, возникает ошибка времени компиляции.
В противном случае, пусть O будет непосредственно включающим классом C. Пусть n будет целым числом, таким образом, что O является n-ным объявлением лексически включающего типа класса, в котором появляется выражение создания экземпляра класса.
Непосредственно включающий экземпляр i является n-ным включающим в себя экземпляром этого.
Я не понял, что означает жирный корпус. Позвольте мне привести пример, который я не собирался компилировать:
class A{
int a;
public static void main (String[] args) throws java.lang.Exception{
class Foo{
void bar(){
}
}
Foo f = new Foo(); //Instance creation expression occured in the static context
}
}
Что в этом плохого? Не могли бы вы привести пример, описывающий второй пункт?
2 ответа
Я предполагаю следующий случай:
public class A {
public class B { /* ... */ }
public static void createB() {
new B(); // <<=== This should fail
}
}
Отмеченная строка должна завершиться сбоем, поскольку внутренний класс B не является статическим, поэтому для него требуется включающий экземпляр A. Не существует такого включающего экземпляра, поскольку метод createB()
статичен
ОБНОВЛЕНИЕ: я принял вопрос о внутренних классах в целом, как показано в моем примере. В контексте локальных классов я также не могу интерпретировать документацию.
Вы должны прочитать эти две строки:
Если C происходит в статическом контексте, то у меня нет немедленно включающего экземпляра.
В противном случае, если выражение создания экземпляра класса происходит в статическом контексте, возникает ошибка времени компиляции.
Ваш случай - первый случай - вы определили класс Foo
в статическом контексте (main
метод), и, следовательно, экземпляр f
не имеет вложенного экземпляра.
Однако, если вы определите класс Foo
вне main
метод, и попробуйте создать экземпляр Foo
в main
метод, вы получите ошибку, если вы не измените Foo
быть статическим классом.
class A
{
int a;
class Foo
{
void bar()
{
}
}
public static void main (String[] args) throws java.lang.Exception
{
Foo f = new Foo(); // this should fail
}
}