簡體   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