微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

带有内部枚举类的日食AST的奇怪结果

如何解决带有内部枚举类的日食AST的奇怪结果

我正在尝试使用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);
    }
}

如您所见,我正在定义一个非常简单的示例类,该类具有一个内部枚举类,其中两个类都具有具有相同签名的方法

奇怪的是,此代码输出(即经过解析的TypeDeclaration)是

class Foo {
  enum Bar;
{
  }
  int getValue(){
    return 4;
  }
{
  }
  int getValue(){
    return 42;
  }
}

由于某些原因,TypeDeclaration的主体包括

  1. 一个FieldDeclarationenum Bar;
  2. 一个Initializer{}
  3. 一个MethodDeclarationint getValue(){ return 4; }
  4. 一个Initializer{}
  5. 一个MethodDeclarationint getValue(){ return 42; }

这导致我的实际代码抛出错误,因为看起来好像有两个签名相同的方法

为什么我没有使用内部方法将枚举作为实际的EnumDeclaration,而是看起来枚举内部的方法实际上是在外部类本身中声明的?

我不认为这是一个错误,因为eclipse中的AST View可以很好地处理类似的类,但是我无法弄清楚我在做什么错。启用绑定解析无济于事。

解决方法

您需要通过调用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());

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。