Чтобы получить доступ к полю x внешнего класса A из внутреннего класса B, я понимаю, что вы можете использовать «A.this.x». Но что, если внешний класс также является анонимным? Например,
public class Main1 {
public static void main(String[] args) {
Comparable c1 = new Comparable(){
int x = 3;
public int compareTo(Object o) {
Comparable c2 = new Comparable(){
int x = 4;
public int compareTo(Object o) {
return x; // <-- THIS LINE
}
};
return c2.compareTo(o);
}
};
System.out.println(c1.compareTo(null));
}
}
Когда этот код выполняется, печатается значение 4, потому что это значение поля x c2. Тем не менее, я хотел бы изменить строку, помеченную «ЭТА ЛИНИЯ», чтобы она возвращала внешний класс x (то есть поле x в c1 со значением 3). Если бы внешний класс (то есть класс c1) был именованным классом A, то я мог бы заменить
return x;
с
return A.this.x;
Но поскольку внешний класс также является анонимным, у меня нет имени для использования.
Вопрос: Есть ли способ изменить строку, помеченную «ЭТА ЛИНИЯ», чтобы она ссылалась на поле x c1, а не на c2, без изменения анонимных классов в именованные классы?
Я понимаю, что этот код действительно уродлив, и это не очень хороший стиль программирования для использования анонимных классов таким образом, но код генерируется другой программой, и это самый простой способ реализовать генератор.