Выражение создания экземпляра локального класса в статическом контексте

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
    }
}

DEMO

Что в этом плохого? Не могли бы вы привести пример, описывающий второй пункт?

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
    }
}
Другие вопросы по тегам