2010-01-24 52 views
9

我可以声明下列包修饰,但它似乎并没有对任何事情有任何影响:为什么修饰符被允许用于一个包时,他们似乎什么都不做?

private public protected static final package com.stackoverflow.mangodrunk 

// ... 
class Whatever { 
    // ... 
} 

所以我的问题是,没有一包decleration前添加修饰符做任何事情,为什么会是编译器允许吗?

更新:似乎是与Eclipse捆绑在一起的编译器的问题,正如其他人提到的那样,这是使用Sun JDK的编译器错误。

+0

哇靠,你是对的,Eclipse编译器编译这只是罚款.... – skaffman 2010-01-24 16:17:23

+0

这是一个相当小错误,但如果你想举报它,你可以在这里做:https://bugs.eclipse.org/bugs/ – McDowell 2010-01-24 16:43:08

回答

7

他们不是。你正在使用哪种编译器?

$ javac com/stackoverflow/mangodrunk/Whatever.java 

com/stackoverflow/mangodrunk/Whatever.java:1: class, interface, or enum expected 
private public protected static final package com.stackoverflow.mangodrunk; 
            ^
1 error 
+0

我使用的是JDK 1.6.0_17,并且您是正确的,但在尝试使用javac编译它时出现编译器错误。但在日食下没有问题。 – mangoDrunk 2010-01-24 16:10:30

+1

关于Eclipse JDK有何说法? – duffymo 2010-01-24 16:14:09

+0

可能是他们语法中的一个小错误,导致它忽略*任何*之前“包装”不只是评论?查看是否也忽略了其他关键字。我想你应该报告错误,除非它已经被报告。 – Draemon 2010-01-24 16:22:03

4

根据JLS,唯一可以在package之前的是注释。

PackageDeclaration: 
     Annotationsopt package PackageName ; 

但是注释是这样的(略去了完整的语法):

NormalAnnotation: 
     @ TypeName (ElementValuePairsopt) 

所以你的编译器不应该被允许标准的访问修饰符。

来源:http://java.sun.com/docs/books/jls/third_edition/html/packages.html