我在Eclipse和我的JDK认为合法java之间存在一个有趣的差异。
Eclipse编译以下类,而Mac OS X上的JDK会产生下面的错误。
public class Builder {
private class Item {}
public void addItem(Item i) {}
public static void main(String[] args) {
new Builder() {{
addItem(new Item());
}};
}
}
$ javac Builder.java
Builder.java:9: non-static variable this cannot be referenced from a static context
addItem(new Item());
^
1 error
使Item
类静态解决问题,但它让我有点好奇:Eclipse是否宽松并编译实际上无效的代码?我偶然发现了Mac OS X JDK的怪癖吗?我错过了什么吗?
更新 可能与以下内容相关
$ java -version
java version "1.6.0_33"
Java(TM) SE Runtime Environment (build 1.6.0_33-b03-424-11M3720)
Java HotSpot(TM) 64-Bit Server VM (build 20.8-b03-424, mixed mode)
更新2
使Item更加可见(默认,受保护或公共)也满足JDK编译器。
答案 0 :(得分:4)
javac 1.7.0_04编译源代码时没有错误,所以我建议这是javac 1.6中的一个错误。
答案 1 :(得分:2)
我得到了相同的结果,但有趣的是,将代码更改为:
new Builder() {{
addItem(this.new Item());
}};
(应该相同)会产生不同的错误消息:
Builder.java:9: Builder.Item has private access in Builder
addItem(this.new Item());
我怀疑这是真正的潜在错误 - Item
类是私有的,因此在匿名子类中不可见。将Item
更改为受保护而非私有允许原始版本和this.new
版本成功编译。
答案 2 :(得分:1)
默认情况下,在Eclipse中,默认情况下可能会忽略Access to a non-accessible member of an enclosing type
。如果您转到Project-> Properties-> Java Compiler-> Errors / Warning,您可以启用项目特定设置。 击>
差异可能是因为Eclipse带有自己的编译器 - JDT的一部分,其作用与javac
略有不同。
答案 3 :(得分:0)
我认为这是eclipse编译器中的一个错误。内部Item类不是静态的,因此您只能通过Builder对象访问它,如下所示:
new Builder().new Item()
在静态块中初始化Item类,您没有Builder的实例,因此您发布的此代码不起作用。 非常有趣的错误。
答案 4 :(得分:-2)
将静态添加到项的类声明中,例如static class Item {}