【发布时间】:2011-11-22 22:17:40
【问题描述】:
我正在尝试编译一个被javac 拒绝并出现非法前向引用 错误的Java 类,其中违规引用在词法上 被引用的字段。以下类在显示相同行为的同时被尽可能地精简:
java.util.concurrent.Callable 和Object 的许多用途只是用作占位符来删除不相关的代码。
public class Test {
static final Object foo = method(new java.util.concurrent.Callable<Object>() {
@Override
public Object call() throws Exception {
return bar;
}
});
static final Object bar = foo;
static Object method(Object binder) {
return null;
}
}
使用javac Test.java 编译时,javac 会打印以下错误消息:
Test.java:9: illegal forward reference
static final Object bar = foo;
^
所以编译器抱怨bar 的声明引用了foo,而foo 应该在bar 的声明范围内。但是一旦在foo 的声明中对bar 的引用被删除,例如通过将第 5 行从 return bar; 更改为 return null;,编译器会接受该类。
如何解释?我对 forward 的理解是 lexically after 是错误的还是我不知道的一些特殊情况?
【问题讨论】:
-
我可以确认 Sun 的 JDK 1.6.0_29 中的 javac 拒绝了这一点; Eclipse Indigo 毫无怨言地编译了它。您在 javac 或 Eclipse 中发现了一个错误 - 恭喜!
-
注意可以去掉
method这个方法,直接把新的Callable赋值给foo,同样报错。 -
我认为这是 javac 中的一个错误,尽管我没有足够的语言律师来确定。我注意到你可以通过写
bar = Test.foo来解决它。 -
gcj 4.4.3 也编译了这个。
标签: java javac forward-declaration