Copy ‘xxx’ to effectively final temp variable 问题解决
今天在项目中修改接口的时候突然发现了类型问题,便用if函数对变量进行了类型的校验。
int a = 0;
if (params.get("a") instanceof Integer) {
a = (int) params.get("a");
}else {
a = Integer.parseInt(params.get("a").toString());
}
没有多想,便进行了提交,编译后发现竟然报错了。筛查后发现,在这块代码下有一处匿名内部类调用了该变量。
int finalA = a;
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("thread a = " + finalA);
}
});
出错的原因是:内部类对象的生命周期会超过局部变量的生命周期。
所以在匿名内部类中,只能调用被final修饰的局部变量,而在java 8中,如果局部变量被匿名内部类访问,那么该变量会自动被final隐性修饰。Lambda大致同理。