繁体   English   中英

编译器中的错误或我做错了什么?

[英]Bug in compiler or am I doing something wrong?

首先,一些环境:这是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来自番石榴; 至于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);
    }
}

它似乎是一个重复项 - 带接口的Enum类成员无法在内部找到方法

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM