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);
}
}
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". –
@HonzaZidek to wyliczenie jest zdefiniowane w samej klasie narzędzia, a nie poza nim – fge
@HonzaZidek zaktualizowano przykładowy kod – fge