Существует ли синтаксис для получения ссылки на анонимный внутренний класс из другого анонимного внутреннего класса? - PullRequest
5 голосов
/ 28 мая 2010

Рассмотрим этот случай:

public class SomeClass {
    public void someMethod() {
        new SomeInterface() {
              public void someOtherMethod() {
                  new SomeOtherInterface() {
                       new someThirdMethod() {
                            //My question is about code located here.
                       }
                  };
              }
        };
    }
}

Существует ли синтаксис для ссылки на экземпляр анонимного внутреннего класса, представленного SomeInterface в прокомментированном коде? Для SomeClass вы можете сделать SomeClass.this Есть ли эквивалент, чтобы получить реализацию SomeInterface?

Если нет, конечно, вы можете просто определить конечную локальную переменную в реализации SomeInterface и ссылаться на нее, но мне просто интересно, существует ли на самом деле прямая языковая поддержка для ссылки на экземпляр.

1 Ответ

5 голосов
/ 28 мая 2010

Причина, по которой SomeInterface.this не компилируется, заключается в том, что включающий класс не SomeInterface, а скорее какой-то анонимный тип.

Вы не можете использовать квалифицированный this с анонимным типом. Вот почему они анонимны ; вы не можете ссылаться на них по имени, и квалифицированный this работает, явно называя вмещающий тип.

Соблазнительно попробовать что-то вроде:

SomeClass$1.this

Но тогда вы получите ошибку SomeClass$1 cannot be resolved to a type; несмотря на то, что если вы позволите этому коду скомпилироваться без этой строки, он (по всей вероятности) создаст SomeClass$1.class.

Вы можете либо использовать неанонимный класс и использовать квалифицированный this, либо использовать технику локальной переменной final, которую вы упомянули.

Ссылки

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...