Java 错误:从内部类访问局部变量;需要宣布为最终决定
编译以下代码时,我遇到编译错误: java:27:错误:从内部类访问局部变量timeTraveler;需要声明为最终版本Java 错误:从内部类访问局部变量;需要宣布为最终决定,java,Java,编译以下代码时,我遇到编译错误: java:27:错误:从内部类访问局部变量timeTraveler;需要声明为最终版本 import java.util.*; interface TimeTravelCallback { void leaped(int amount); } interface TimeTraveler { void adjust(int amount); } class LinearTimeTraveler implements TimeTraveler {
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) {
到
然后它就起作用了
如果不在方法参数处添加'final',是否还有其他修复方法?如果要对传递给方法的
final
变量执行任何操作,请使用任何收集api,如列表
public void experiment(final List<TimeTraveler> timeTraveler) {
}
公共空间实验(最终列表timeTraveler){
}
现在,您可以修改列表中的值。如果不想添加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
}
};
在方法参数处不添加“final”的情况下是否还有其他修复方法没有。宣布它为最终版本有什么问题吗?。它仍然是可变的。@TheLostMind:嗯,参数本身是不可变的-OP将无法更改其值。但它仍然会引用一个可变对象。请注意,在Java8中,我相信这将是隐式的最终结果,所以这是可以的。@JonSkeet-是的。引用将是最终的(不确定我是否应该使用术语immutable作为引用)。但是对象是可变的。是的,在Java-8中,如果OP在代码的后面部分没有修改这个对象,那么它将是最终的,并且他不会得到以下警告:)
TimeTravelCallback cb = new TimeTravelCallback(timeTraveler) {
public TimeTravelCallback(TimeTraveler timeTraveler){
this.timeTraveler = timeTraveler;
}
@Override public void leaped(int amount) {
timeTraveler.adjust(amount); //error message
}
};