java 静态声明非法_java – 静态最终字段的非法正向引用错误

你对前向参考的理解是正确的.对第9行的foo的引用根本不是前向引用,因为它在声明之前没有以文字形式显示(参见

The Java Language Specification第8.3.2.3节中什么构成前向引用的定义).

您观察到的行为是javac错误的症状.请参见this bug report.问题似乎在编译器的较新版本中已修复,例如. OpenJDK 7.

它仅影响用作最终字段的初始化器的前向引用.这个问题似乎同样影响静态和非静态字段.

请注意,call()中对bar的引用是合法的转发引用,因为它发生在不同的类中(参见The Java Language Specification第8.3.2.3节中的示例).

另外,请注意,以下每个更改都会使错误消失:

制作酒吧非最终:

static Object bar = foo;

在静态或实例初始化程序块中初始化栏:

static final Object bar;

static {

bar = foo;

}

将foo的初始化移动到初始化程序块也有帮助.

从非最终临时引用初始化栏到foo:

static Object tmp = foo;

static final Object bar = tmp;

使用Test.foo(由Tom Anderson发现)或非静态情况下的this.foo初始化栏:

static final Object bar = Test.foo;

使用foo内的call()方法来取消栏并引用对象:

static final Object foo = method(new java.util.concurrent.Callable() {

@Override

public Object call() throws Exception {

return foo;

}

});

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值