Java 为什么我需要在@Override[Internal class]方法中将变量转换为最终数组?

Java 为什么我需要在@Override[Internal class]方法中将变量转换为最终数组?,java,android,final,Java,Android,Final,我正在使用以下代码: public void addConditions(){ final String arriveHourse, departHourse, arriveMinutes, departMinutes; TimePickerDialog.OnTimeSetListener departOnTimeSetListener = new TimePickerDialog.OnTimeSetListener() { @Override

我正在使用以下代码:

 public void addConditions(){
    final String arriveHourse, departHourse, arriveMinutes, departMinutes;
    TimePickerDialog.OnTimeSetListener departOnTimeSetListener = new TimePickerDialog.OnTimeSetListener() {
        @Override
        public void onTimeSet(TimePicker timePicker, int selectedHours, int selectedMinutes) {

            departHourse = String.valueOf(selectedHours);
            departMinutes = String.valueOf(selectedMinutes);

        }
    };

...
}
为什么IDE要求我将
departHourse
转换为最终数组

为什么会发生这种情况,我如何避免这种情况

另外,如果我将变量移到类外,其工作方式如下:

String arriveHourse, departHourse, arriveMinutes, departMinutes;

public void addConditions(){

    TimePickerDialog.OnTimeSetListener departOnTimeSetListener = new TimePickerDialog.OnTimeSetListener() {
        @Override
        public void onTimeSet(TimePicker timePicker, int selectedHours, int selectedMinutes) {

            departHourse = String.valueOf(selectedHours);
            departMinutes = String.valueOf(selectedMinutes);

        }
    };

...
}

departHourse
是最后一个变量。它必须是,才能在匿名内部类中使用。这意味着您不能在匿名内部类中为其分配新值

解决此问题的一种方法是创建单元素数组:

final String[] valueHolder = new String[1];
...
Foo foo = new Foo() {
    @Override public void bar() {
        valueHolder[0] = "Set in bar";
    }
}
另一种方法是使用原子参考:

final AtomicReference<String> valueHolder = new AtomicReference<String>();
...
Foo foo = new Foo() {
    @Override public void bar() {
        valueHolder.set("Set in bar");
    }
}
final AtomicReference valueHolder=新的AtomicReference();
...
Foo Foo=新Foo(){
@覆盖公共无效条(){
估价师。设置(“设置在条形图中”);
}
}
在这两种情况下,都允许您在不更改
值持有者
变量本身的值的情况下提供新信息。

良好说明:

最好的答案是:

简短描述:正在为JVM内的匿名内部类实例(命名闭包)复制变量,因此如果它不是最终的,编译器将需要复制每个参数


在您的情况下,
@override
不是您需要声明params final的原因,原因是-它们在闭包中用作params/局部变量

如果我想更改内部匿名类中的变量并返回它,该怎么办?当使用改造API来使用RESTAPI时,我通常会遇到这个问题。@Kavachhandra:你不能这样做。Java语言规则明确禁止在匿名内部类中使用非final变量。我已经向您展示了两种解决方法,第三种是不使用匿名内部类——创建一个命名类并在其中声明一个字段?这是真的吗?@ArduinoAndroid:这个问题太模糊了,无法回答。