Дело в том, что метод локального переменные из типа ограждающей фактически копируются на экземпляры анонимных классов (это потому, проблем с кадрами активации, но я не буду углубляться в детали, поскольку это не имеет отношения к вопросу), поэтому они должны быть окончательными, потому что переменная в экземпляре вложенного типа больше не то же самое.
Итак, вот первый пример:
void foo() {
int a = 3;
new Runnable() {
@Override
public void run() {
a += 3;
}
};
}
Это не компилируется, потому что вы не можете ссылаться на неконечное переменную в методе анонимного класса. Когда вы добавляете окончательный модификатор к объявлению a
, значение a
будет скопировано в созданный экземпляр анонимного класса, который вы определили. Однако вам не будет позволено изменять значение a
, поскольку изменения не будут видны методу, в котором объявлен a
.
Однако анонимные классы не являются статичными, то есть, у них есть ссылка на ограждающий экземпляр (если только метод, при котором они объявлены не статичен), которые вы можете использовать, чтобы изменить переменные вмещающие например:
int a = 3;
void foo() {
new Runnable() {
@Override
public void run() {
a += 3;
}
};
}
Этот пример компилируется, и он будет увеличивать a
на 3 каждый раз, когда вызывается метод вызова экземпляра анонимного класса. (В этом примере это никогда не вызывается, но это просто пример.)
Итак, чтобы суммировать, вам нужно преобразовать переменную seatno
из локальной локальности метода в переменную экземпляра охватывающего типа.Или, если это так, вам нужно удалить последний модификатор, поскольку конечные переменные могут быть назначены только один раз.
Обновление: В Java 8, понятие эффективно конечных переменных вводится (см Java Language Specification). Однако в первом примере этого сообщения переменная a
назначается несколько раз, что предотвращает ее окончательную окончательность. Это означает, что этот пример до сих пор не компилируется с Java 8. (Ошибка компиляции: «Локальная переменная a, определенная в охватывающей области, должна быть окончательной или эффективной окончательной»)
Ваша переменная 'seatno' имеет в ней последнее ключевое слово. –