पहला, कुछ पर्यावरण: यह ओरेकल का 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);
}
}
मैं सोच रहा हूं कि आप 'निजी enum' कैसे प्राप्त कर सकते हैं। मैं इस तक नहीं पहुंच सकता, मेरा कंपाइलर हमेशा कहता है '' एननाम फील्ड नोडफनल के लिए अवैध संशोधक; केवल सार्वजनिक की अनुमति है "। –
@HonzaZidek यह enum उपयोगिता वर्ग के भीतर ही परिभाषित है, इसके बाहर नहीं – fge
@HonzaZidek अद्यतन कोड नमूना – fge