2014-04-27 7 views
11

पहला, कुछ पर्यावरण: यह ओरेकल का 1.6.0_45 जेडीके है, और आईडीईए 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 अमरूद से कर रहे हैं; फील्ड नोड के रूप में, यह एएसएम 5.0.1 (org.objectweb.asm.tree.FieldNode) से है।

ध्यान दें कि मैं आईडीईए का उपयोग करता हूं (13.1 यदि यह बिल्कुल मायने रखता है)।

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

पता नहीं चेतावनी दिखाने ... लेकिन संकलक खुश नहीं है:

:

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); 
} 

और इसके साथ, यह संकलित करता है!

यहां क्या हो रहा है? कौन सही है? आईडीईए या जावैक?

संपादित

मैं इस की कोशिश की है, और यह संकलित:

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

मैं सोच रहा हूं कि आप 'निजी enum' कैसे प्राप्त कर सकते हैं। मैं इस तक नहीं पहुंच सकता, मेरा कंपाइलर हमेशा कहता है '' एननाम फील्ड नोडफनल के लिए अवैध संशोधक; केवल सार्वजनिक की अनुमति है "। –

+0

@HonzaZidek यह enum उपयोगिता वर्ग के भीतर ही परिभाषित है, इसके बाहर नहीं – fge

+0

@HonzaZidek अद्यतन कोड नमूना – fge

उत्तर

3

यह एक नकली आइटम की तरह लगता है - Enum class member with interface cannot find methods internally

शायद JDK -6 में एक बग नहीं था - देखें: एक अंतरफलक स्रोत फ़ाइलों https://bugs.openjdk.java.net/browse/JDK-6724345 के रूप में दर्ज enum कक्षाओं के लिए https://bugs.openjdk.java.net/browse/JDK-7049773

  • गलत विधि संकल्प को लागू करने

    1. enum के लिए असंगत संकलन का परिणाम है।

  • संबंधित मुद्दे