gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 08:25:33 24 4
gpt4 key购买 nike

我正在使用以下代码:

 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com