我正在编写一个涉及时差的应用程序,有些东西我不明白,
final DatePicker datePick=new DatePicker();
LocalDate time;
Label label=new Label();
datePick.setOnAction(new EventHandler<ActionEvent>(){
public void handle(ActionEvent e){
time=datePick.getValue();//doesn't work, must 'LocalDate time=datePick.getValue();
label.setText(time);//doesn't work must label.setText("Time now:"+time)
}
});
它给出一个错误,指出“从内部类引用的局部变量必须是最终的或有效的”,无论如何,我所做的就是在setOnAction()中声明'time'变量,并且它起作用了,那么怎么了?和'label.setText(time);'如果我没有在其中写一些文本,例如'label.setText(“ Time now:” + time);“ ,也不会工作,那很奇怪,为什么呢?
答案 0 :(得分:2)
Java将您从匿名类/ lambda表达式访问的局部变量限制为在赋值后永不更改其值的变量(即,如果您将其声明为final
,则编译器不会抱怨这些变量)。如果您可以从匿名类中写入局部变量,则将违反此条件。由于这个原因,不可能从匿名类中写入包含方法的局部变量。
您应该在仍然需要它们的范围内声明变量。
关于label.setText(time);
:
Label.setText
是带有String
参数的方法。由于String
不是LocalDate
的超类型,因此简单的分配将不起作用。您需要将日期转换为String
。字符串串联会自动执行此操作,即+
运算符接收String s
作为第一操作数,而Object o
作为第二操作数输出s
和Objects.toString(o)
的串联。
您可以自己转换为字符串:
label.setText(Objects.toString(time, ""));
或者使用更复杂的方法转换为字符串。