Java 错误:从内部类访问局部变量;需要宣布为最终决定

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 {

编译以下代码时,我遇到编译错误:

java:27:错误:从内部类访问局部变量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
        }
    };