2014-04-27 16 views
11

Po pierwsze, niektóre środowiska: to JDK Oracle 1.6.0_45 i IDEA 13.1.Błąd w kompilatorze lub czy robię coś nie tak?

I natknął się na najbardziej dziwaczne błąd kompilatora:

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 i PrimitiveSink są z Guava; jak FieldNode, jest z ASM 5.0.1 (org.objectweb.asm.tree.FieldNode).

Pamiętaj, że używam IDEA (13.1, jeśli to w ogóle ma znaczenie). Teraz, na początku, miałem jeden sposób zdefiniowany tak:

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

IDEA nie wykazują żadnych ostrzeżeń ... Ale kompilator nie jest zadowolony:

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 

Linia 53 jest to jedno:

FieldNodeFunnel.INSTANCE.funnel(node, into); 

To jest najbardziej dziwaczne, nie rozumiem dlaczego. I wtedy zrobiłem to:

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

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

A wraz z nim kompilacja!

Co się tutaj dzieje? Kto ma rację? IDEA lub javac?

EDIT

Próbowałem tego i kompiluje:

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

Ale dlaczego muszę obsadę w ogóle?

Próbowałem też użyć "regularnego singleton" jak to i to również prace:

@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); 
    } 
} 
+0

Zastanawiam się, jak możesz mieć "prywatne wyliczenie". Nie mogę tego osiągnąć, mój kompilator zawsze mówi: "Nielegalny modyfikator dla enum FieldNodeFunnel; dozwolone jest tylko publiczne". –

+0

@HonzaZidek to wyliczenie jest zdefiniowane w samej klasie narzędzia, a nie poza nim – fge

+0

@HonzaZidek zaktualizowano przykładowy kod – fge

Odpowiedz