У анонимных внутренних классов есть тип, но нет имени.
Вы можете получить доступ к полям, не определенным именованным супертипом. Однако после присвоения именованной переменной типа интерфейс теряется.
Очевидно, вы можете получить доступ к полям внутри самого внутреннего класса. Один из способов добавления кода - через инициализатор экземпляра:
final AtomicInteger y = new AtomicInteger();
new Runnable() {
int x;
{
x = 5;
doRun(this);
y.set(x);
}
public void run() {
... blah ...
}
};
Значение, возвращаемое выражением анонимного внутреннего класса, имеет анонимный тип, поэтому у вас есть один шанс использовать его вне самого класса:
final int y = new Runnable() {
int x;
{
x = 5;
doRun(this);
}
public void run() {
... blah ...
}
}.x;
Вы также можете передать его через метод, объявленный как:
<T extends Runnable> T doRun(T runnable);