该代码来自Thinking in Java一书。我不知道为什么我必须在final这里添加语法。我删除了final,程序仍然编译。但是,书中说我必须添加它。
// initialization. A briefer version of Parcel5.java.
public class Parcel9 {
// Argument must be final to use inside
// anonymous inner class:
public Destination destination(final String dest) {
return new Destination() {
private String label = dest;
public String readLabel() { return label; }
};
}
public static void main(String[] args) {
Parcel9 p = new Parcel9();
Destination d = p.destination("Tasmania");
}
} ///:~
Run Code Online (Sandbox Code Playgroud)
ern*_*t_k 11
这本书(或章节/章节)很可能是在 Java 8 时代之前编写的。
Java 对匿名类施加了限制,匿名类可能无法访问局部变量,除非它是最终的。
在 Java 8 中,该限制也适用于 lambda 表达式。但是,除此之外,Java 8 添加了 Effective final的概念,这使得编译器更聪明,因为它检测到变量是 final 的,因为它没有在本地重新分配,从而final在这样的情况下显式使用关键字可选案件。
因此,如果您在 Java 7 或更早版本上编译该代码,您将遇到本书教读者避免的编译器错误。