【问题标题】:Bug in compiler or am I doing something wrong?编译器中的错误还是我做错了什么?
【发布时间】:2014-04-27 14:15:15
【问题描述】:

首先,一些环境:这是 Oracle 的 1.6.0_45 JDK,和 IDEA 13.1。

我偶然发现了一个最奇怪的编译器错误:

public final class AsmFunnels
{
    private AsmFunnels()
    {
    }

    // ...

    public static void funnelFieldNode(final FieldNode node,
        final PrimitiveSink into)
    {
        FieldNodeFunnel.INSTANCE.funnel(node, into);
    }

    // ...

    @ParametersAreNonnullByDefault
    private enum FieldNodeFunnel
        implements Funnel<FieldNode>
    {
        INSTANCE
        {
            @Override
            public void funnel(final FieldNode from, final PrimitiveSink into)
            {
                into.putUnencodedChars(from.name)
                    .putUnencodedChars(from.desc)
                    .putUnencodedChars(from.signature);
            }
        }
    }

    //...

}

FunnelPrimitiveSink 来自 Guava; FieldNode 来自 ASM 5.0.1 (org.objectweb.asm.tree.FieldNode)。

请注意,我使用的是 IDEA(如果这很重要,则为 13.1)。现在,起初,我有一个这样定义的方法:

public static void funnelFieldNode(final FieldNode node,
    final PrimitiveSink into)
{
    FieldNodeFunnel.INSTANCE.funnel(node, into);
}

IDEA 不显示任何警告...但是编译器不高兴:

Error:(53, 33) java: /home/fge/src/perso/parboiled1/grappa/src/main/java/org/parboiled/transform/process/AsmFunnels.java:53: cannot find symbol
symbol  : method funnel(org.objectweb.asm.tree.FieldNode,com.google.common.hash.PrimitiveSink)
location: class org.parboiled.transform.process.AsmFunnels.FieldNodeFunnel

第 53 行是这一行:

    FieldNodeFunnel.INSTANCE.funnel(node, into);

这是最奇怪的,我不明白为什么。然后我这样做了:

private static Funnel<FieldNode> fieldNodeFunnel()
{
    return FieldNodeFunnel.INSTANCE;
}

public static void funnelFieldNode(final FieldNode node,
    final PrimitiveSink into)
{
    fieldNodeFunnel().funnel(node, into);
}

这样,它就可以编译了!

这里发生了什么?谁是对的? IDEA 还是 javac?

编辑

我试过了,它可以编译:

((Funnel<FieldNode>) FieldNodeFunnel.INSTANCE).funnel(node, into);

但为什么我需要演员表呢?

我也尝试过像这样使用“常规单例”,它有效:

@ParametersAreNonnullByDefault
private static final class FieldNodeFunnel
    implements Funnel<FieldNode>
{
    private static final Funnel<FieldNode> INSTANCE
        = new FieldNodeFunnel();

    @Override
    public void funnel(final FieldNode from, final PrimitiveSink into)
    {
        into.putUnencodedChars(from.name)
            .putUnencodedChars(from.desc)
            .putUnencodedChars(from.signature);
    }
}

【问题讨论】:

  • 我想知道你怎么能拥有private enum。我无法做到这一点,我的编译器总是说"Illegal modifier for the enum FieldNodeFunnel; only public is permitted"
  • @HonzaZidek 这个枚举是在实用程序类本身中定义的,而不是在它之外
  • @HonzaZidek 更新代码示例

标签: java compiler-construction intellij-idea javac


【解决方案1】:

这似乎是一个重复的项目 - Enum class member with interface cannot find methods internally

JDK-6 中可能存在错误 - 请参阅:

  1. 枚举实现接口https://bugs.openjdk.java.net/browse/JDK-7049773的编译结果不一致@

  2. 作为源文件输入的枚举类的方法解析不正确https://bugs.openjdk.java.net/browse/JDK-6724345

【讨论】:

    猜你喜欢
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多