我正在使用以下代码:
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";
}
}
另一种方法是使用AtomicReference
:
final AtomicReference<String> valueHolder = new AtomicReference<String>();
...
Foo foo = new Foo() {
@Override public void bar() {
valueHolder.set("Set in bar");
}
}
在这两种情况下,这允许您在不更改 valueHolder
变量本身的值的情况下提供新信息。
关于java - 为什么我需要在 @Override[inner class] 方法中将变量转换为最终数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45648244/