带有内部枚举的 Eclipse AST 的奇怪结果 class
Strange result of eclipse AST with inner enum class
我正在试验 eclipse jdt AST,运行 出现了一种我无法解释的奇怪行为。
这是我的示例代码:
public static void main(String[] args) {
StringBuilder content = new StringBuilder();
content.append("class Foo {");
content.append(" enum Bar {");
content.append(" VALUE;");
content.append(" int getValue() {");
content.append(" return 4;");
content.append(" }");
content.append(" }");
content.append(" int getValue() {");
content.append(" return 42;");
content.append(" }");
content.append("}");
ASTParser parser = ASTParser.newParser(AST.JLS13);
parser.setKind(ASTParser.K_COMPILATION_UNIT);
parser.setSource(content.toString().toCharArray());
CompilationUnit astNode = (CompilationUnit) parser.createAST(null);
Visitor rtVisitor = new Visitor();
astNode.accept(rtVisitor);
}
private static class Visitor extends ASTVisitor {
@Override
public boolean visit(TypeDeclaration node) {
System.out.println(node);
return super.visit(node);
}
}
如您所见,我正在定义一个非常简单的示例 class,它有一个内部枚举 class,其中两个 class 都有一个具有相同签名的方法。
奇怪的是,这段代码的输出(即解析后的TypeDeclaration
)是
class Foo {
enum Bar;
{
}
int getValue(){
return 4;
}
{
}
int getValue(){
return 42;
}
}
出于某种原因,TypeDeclaration
的正文包括:
- 一个
FieldDeclaration
: enum Bar;
- 一个
Initializer
: {}
- 一个
MethodDeclaration
: int getValue(){ return 4; }
- 另一个
Initializer
:{}
- 另一个
MethodDeclaration
:int getValue(){ return 42; }
这导致我的实际代码抛出错误,因为看起来有两个方法具有相同的签名。
为什么我没有将枚举作为具有内部方法的实际 EnumDeclaration
获取,而是看起来枚举内部的方法实际上是在外部 class 本身中声明的?
我不认为这是一个错误,因为 eclipse 中的 AST View 处理类似的 class 非常好,但我无法弄清楚我做错了什么。启用绑定解析没有帮助。
您需要通过调用 parser.setCompilerOptions
来设置编译器选项,以便正确处理源文件。
由于您使用的是 enum
关键字,因此您至少需要 Java 5 合规性:
ASTParser parser = ASTParser.newParser(AST.JLS13);
Map options = JavaCore.getOptions();
JavaCore.setComplianceOptions(JavaCore.VERSION_1_5, options);
parser.setCompilerOptions(options);
parser.setKind(ASTParser.K_COMPILATION_UNIT);
parser.setSource(content.toString().toCharArray());
我正在试验 eclipse jdt AST,运行 出现了一种我无法解释的奇怪行为。
这是我的示例代码:
public static void main(String[] args) {
StringBuilder content = new StringBuilder();
content.append("class Foo {");
content.append(" enum Bar {");
content.append(" VALUE;");
content.append(" int getValue() {");
content.append(" return 4;");
content.append(" }");
content.append(" }");
content.append(" int getValue() {");
content.append(" return 42;");
content.append(" }");
content.append("}");
ASTParser parser = ASTParser.newParser(AST.JLS13);
parser.setKind(ASTParser.K_COMPILATION_UNIT);
parser.setSource(content.toString().toCharArray());
CompilationUnit astNode = (CompilationUnit) parser.createAST(null);
Visitor rtVisitor = new Visitor();
astNode.accept(rtVisitor);
}
private static class Visitor extends ASTVisitor {
@Override
public boolean visit(TypeDeclaration node) {
System.out.println(node);
return super.visit(node);
}
}
如您所见,我正在定义一个非常简单的示例 class,它有一个内部枚举 class,其中两个 class 都有一个具有相同签名的方法。
奇怪的是,这段代码的输出(即解析后的TypeDeclaration
)是
class Foo {
enum Bar;
{
}
int getValue(){
return 4;
}
{
}
int getValue(){
return 42;
}
}
出于某种原因,TypeDeclaration
的正文包括:
- 一个
FieldDeclaration
:enum Bar;
- 一个
Initializer
:{}
- 一个
MethodDeclaration
:int getValue(){ return 4; }
- 另一个
Initializer
:{}
- 另一个
MethodDeclaration
:int getValue(){ return 42; }
这导致我的实际代码抛出错误,因为看起来有两个方法具有相同的签名。
为什么我没有将枚举作为具有内部方法的实际 EnumDeclaration
获取,而是看起来枚举内部的方法实际上是在外部 class 本身中声明的?
我不认为这是一个错误,因为 eclipse 中的 AST View 处理类似的 class 非常好,但我无法弄清楚我做错了什么。启用绑定解析没有帮助。
您需要通过调用 parser.setCompilerOptions
来设置编译器选项,以便正确处理源文件。
由于您使用的是 enum
关键字,因此您至少需要 Java 5 合规性:
ASTParser parser = ASTParser.newParser(AST.JLS13);
Map options = JavaCore.getOptions();
JavaCore.setComplianceOptions(JavaCore.VERSION_1_5, options);
parser.setCompilerOptions(options);
parser.setKind(ASTParser.K_COMPILATION_UNIT);
parser.setSource(content.toString().toCharArray());