代码在Eclipse中有效,不能由JDK编译

时间:2012-08-06 19:01:48

标签: java eclipse

我在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编译器。

5 个答案:

答案 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 {}