编译以下代码时,出现编译错误:
MadScientist.java:27: Error: local variable timeTraveler is accessed from within inner class; needs to be declared final
import java.util.*;
interface TimeTravelCallback {
void leaped(int amount);
}
interface TimeTraveler {
void adjust(int amount);
}
class LinearTimeTraveler implements TimeTraveler {
@Override public void adjust(int amount) {
}
}
public class MadScientist {
public static void main(String[] args) {
MadScientist madScientist = new MadScientist();
TimeTraveler linearTimeTraveler = new LinearTimeTraveler();
madScientist.experiment(linearTimeTraveler);
}
public void experiment(TimeTraveler timeTraveler) {
TimeTravelCallback cb = new TimeTravelCallback() {
@Override public void leaped(int amount) {
timeTraveler.adjust(amount); //error message
}
};
cb.leaped(20);
}
}
如果我改变
public void experiment(TimeTraveler timeTraveler) {
到
public void experiment(final TimeTraveler timeTraveler) {
然后它的工作原理。
如果没有添加' final'还有其他任何修复吗?在方法参数?
答案 0 :(得分:0)
如果您想对传递给您的方法的final
变量执行任何操作,请使用List
之类的任何集合API。
public void experiment(final List<TimeTraveler> timeTraveler) {
}
现在,您可以修改列表中的值。
答案 1 :(得分:0)
如果您不想添加final,则应在内部类TimeTravelCallback中创建构造函数,并将timeTraveler对象传递给此构造函数:
TimeTravelCallback cb = new TimeTravelCallback(timeTraveler) {
public TimeTravelCallback(TimeTraveler timeTraveler){
this.timeTraveler = timeTraveler;
}
@Override public void leaped(int amount) {
timeTraveler.adjust(amount); //error message
}
};