我试图编译其中一个Java类javac
与拒绝 非法向前引用 错误,其中有问题的参考是词汇 后 的基准场。在显示相同行为时,将尽可能精简以下类:
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
的声明范围内。但是,一旦删除了bar
in
foo
的声明的引用(例如,通过将第5行从更改return bar;
为)return null;
,编译器将接受该类。
如何解释呢?我对 前锋的 理解是错误 之后的词汇 意义 , 还是我不知道的某些特殊情况?
您对 前瞻性参考的 理解是正确的。第foo
9行上的引用根本不是 前向引用
,因为它在声明之前不会在文本上出现(请参阅Java语言规范
8.3.2.3节中对构成 前向引用
的定义)。
您观察到的行为是javac 错误
的症状。请参阅此错误报告。该问题似乎已在较新版本的编译器(例如OpenJDK
7)中得到解决。
它仅影响用作 最终* 字段初始化器的 前向引用 。该问题似乎同样影响静态和非静态字段。 *
请注意,对bar
in 的引用call()
是合法的 正向引用,
因为它发生在不同的类内部(请参见Java语言规范
8.3.2.3节中的示例)。
另外,请注意,以下每个更改都会使错误消失:
使bar
非决赛:
static Object bar = foo;
初始化bar
静态或实例初始化块:
static final Object bar;
static {
bar = foo;
}
将初始化foo
移至初始化程序块也有帮助。
bar
从非最终临时参考中初始化foo
:
static Object tmp = foo;
static final Object bar = tmp;
bar
用Test.foo
(由Tom Anderson找到)或this.foo
在非静态情况下初始化:
static final Object bar = Test.foo;
bar
使用foo
inside 移除并引用该对象call()
:
static final Object foo = method(new java.util.concurrent.Callable<Object>() {
@Override
public Object call() throws Exception {
return foo;
}
});
问题内容: 我正在学习Java。我编写了以下代码,但是当我尝试输入时,我在Arrayfunction()中收到此错误“无法对非静态输入字段进行静态引用”。为什么会这样,我该如何解决? } 问题答案: 扫描仪未定义为静态,因此在错误的范围内 在内部创建Scanner实例, 或使用以下方法创建扫描仪
我有一个私有int数组,我需要以某种方式找到长度,但在静态类下无法做到这一点。我必须保持类的静态,是否可以添加其他方法来将a.length更改为其他方法? 该问题是由a.length引起的。
我们正在开发基于spring boot 2.5.6的支付应用程序。该应用程序托管在docker上,并在Java14上启动。我们创建了一个名为的抽象类,它是,包含两个变量和。所有枚举类都扩展了这个基类,并在其中定义常量。 这个决定是为了定制整个应用程序层中使用的枚举。你可以在下面看到一个例子: 该类在实体层中用作嵌入变量,如下所示: 系统工作得很好,但是发生了一些错误,ShapeEnum的字段。RE
问题内容: 使用JavaDoc,如何在类中引用最终静态字段的值? 我希望在此示例中将其替换为field的值。 问题答案: 你的意思是?
问题内容: 只是为了澄清我正在考虑的这个权利,在Java中,静态字段是整个类使用的变量/字段,还是可以用于引用该类的所有对象?非静态字段是由对象定义的变量吗?并且与对象1引用相同类的第二个对象可以具有与对象1的静态字段不同的值吗? 问题答案: 与实例变量不同,在创建该类的实例之前,可以访问该类中的静态字段或静态类变量。在运行时创建该类的实例时,将创建该类中的实例变量(非静态变量)。因此,直到创建该
我想澄清一下,在java中,静态字段是整个类使用的变量/字段,或者可以被引用该类的所有对象使用?非静态字段是由对象定义的变量?第二个对象引用与对象1相同的类,它可以对对象1的静态字段具有不同的值?