Java Decompiler生成抽象枚举

时间:2015-01-08 10:20:05

标签: java

我使用JD来反编译.jar可执行文件。我遇到了一个无法编译的抽象枚举代码:

private static abstract enum Type {
    ANONYMOUS(4) , STANDARD(0);

    private final int start;

    private Type(int start) {
        this.start = start;
    }

    public int getStart() {
        return this.start;
    }

    public abstract void insertHeader(Sheet paramSheet,
            SummaryCodec.Style paramStyle, float paramFloat1,
            float paramFloat2);

    public abstract String insertCommentSource(String paramString);

    public abstract int insertBreakdown(Sheet paramSheet,
            SummaryCodec.Style paramStyle, String paramString,
            Entry paramEntry, int paramInt);

    public abstract void collateComment(List<String> paramList,
            String paramString);
}

编译器错误: 成员枚举类型的非法修饰符;只有公共的,受保护的,私人的和允许静态 枚举常量ANONYMOUS必须实现抽象方法collat​​eComment(List,String) 枚举常量STANDARD必须实现抽象方法collat​​eComment(List,String)

在哪里可以找到ANONYMOUS和STANDARD抽象方法实现的代码?我在同一个文件中找不到它。试图在其他文件中寻找它。

2 个答案:

答案 0 :(得分:4)

JD显然有一个用抽象方法反编译枚举的错误;你不应该获得该类签名(它与字节码相对应,但没有考虑到Java编译器对enum所做的魔术)。

覆盖声明的方法的每个枚举实例都会获得自己的.class文件,就像匿名类一样。在与Type$1.class相同的目录中查找名为Type.class的文件。

答案 1 :(得分:0)

制作抽象枚举没有意义,因为你肯定会有实例。 事实上,ANONYMOUS和STANDARD是枚举类型的实例,这也是编译器告诉您必须实现抽象方法insertCommentSource的原因。

我不知道为什么反编译器生成了这个代码,但我非常确定这不符合Java语言规范!它也没有意义;)