Подтвердить что ты не робот

Ошибка в компиляторе, или я делаю что-то неправильно?

Во-первых, некоторая среда: это 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);
            }
        }
    }

    //...

}

Funnel и PrimitiveSink - из Гуавы; как для 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);
    }
}
4b9b3361

Ответ 1

Кажется, что дублирующийся элемент - Член класса Enum с интерфейсом не может найти методы внутри себя.

Вероятно, в JDK-6 была ошибка: см.