Объяснение поведения вашего примера кода состоит в том, что this
определен как класс, внутри которого вы в данный момент находитесь «наиболее». В этом случае вы «большинство» внутри анонимного внутреннего класса, который может выполнять подклассы, и нет метода, который соответствует run(int)
. Чтобы расширить поиск, укажите, какой this
вы хотите использовать, указав NotApplicable.this.run(42)
.
JVM будет оценивать следующим образом:
this
-> выполняющийся в данный момент экземпляр Runnable
с методом run()
NotApplicable.this
-> выполняющийся в данный момент экземпляр NotApplicable
с методом run(int)
Компилятор будет искать в дереве вложенности первый метод, соответствующий ИМЯ метода. - Спасибо DJClayworth за это разъяснение
Анонимный внутренний класс не является подклассом внешнего класса. Из-за этой взаимосвязи и внутренний класс, и внешний класс должны иметь метод с точно такой же сигнатурой, а самый внутренний блок кода должен иметь возможность определить, какой метод он хочет запустить.
public class Outer{
public Outer() {
new Runnable() {
public void printit() {
System.out.println( "Anonymous Inner" );
}
public void run() {
printit(); // prints "Anonymous Inner"
this.printit(); //prints "Anonymous Inner"
// would not be possible to execute next line without this behavior
Outer.this.printit(); //prints "Outer"
}
};
}
public void printit() {
System.out.println( "Outer" );
}
}