我想在鼠标点击上为30个对象创建事件集,所有这些对象都是这样做的:
for(int i=0;i<30;i++){
seats[i].setOnMouseClicked(e->{
seats[i].setEffect(lighting);
});
}
但我一直收到这些错误:
error: local variables referenced from a lambda expression must be final or effectively final
seats[i].setEffect(lighting);
任何建议如何修复它而不是手动编写30次
答案 0 :(得分:2)
您无法在lambda表达式中引用变量i
,因为在执行lambda时它的值会发生变化。相反,做:
for(int i=0;i<30;i++){
Node seat = seats[i];
seat.setOnMouseClicked(e->{
seat.setEffect(lighting);
});
}
这假定lighting
明确final
(即声明为final
),&#34;有效最终&#34}; (即只分配一次值,因此可以声明final
而不引入编译错误),或者是一个字段(不是局部变量)。
答案 1 :(得分:0)
在lambda表达式中,局部变量必须是最终的或有效的最终。
这意味着您无法对lambda中使用的局部变量进行赋值,其中local表示在包含lambda表达式的方法范围中定义的
这样做不工作:
//in method
int a = 5;
x.setOnMouseClicked(e->{
a = a + 5 // <-- assignment
});
这两个都没有:
//in method
for(int a = 0; a < 10; a++) { // <-- assignment
x.setOnMouseClicked(e->{
x.doSomething(a); // <-- a is not effectively final
});
}
这有效:
// in class
private int a = 5;
// in method
x.setOnMouseClicked(e->{
a = a + 5 // <-- works since a is not a local variable
});
这也有效:
// in method
MyObj o = new MyObj(); // object with member public int a;
x.setOnMouseClicked(e->{
o.a = o.a + 5 // o is a local variable, but o is not reassigned, only a is.
});