Zuerst einige Umgebung: Dies ist Oracles 1.6.0_45 JDK und IDEA 13.1.Fehler im Compiler oder mache ich etwas falsch?
ich auf einen bizarrsten Compiler-Fehler gestolpert:
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
und PrimitiveSink
von Guava sind; wie bei FieldNode, ist es von ASM 5.0.1 (org.objectweb.asm.tree.FieldNode
).
Beachten Sie, dass ich IDEA (13.1, wenn das überhaupt zählt) verwenden. Nun, zuerst hatte ich eine Methode wie folgt definiert:
public static void funnelFieldNode(final FieldNode node,
final PrimitiveSink into)
{
FieldNodeFunnel.INSTANCE.funnel(node, into);
}
IDEA keine Warnungen zeigen ... Aber der Compiler ist nicht glücklich:
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
Linie 53 ist diese:
FieldNodeFunnel.INSTANCE.funnel(node, into);
Das ist sehr bizarr, ich verstehe nicht warum. Und dann tat ich das:
private static Funnel<FieldNode> fieldNodeFunnel()
{
return FieldNodeFunnel.INSTANCE;
}
public static void funnelFieldNode(final FieldNode node,
final PrimitiveSink into)
{
fieldNodeFunnel().funnel(node, into);
}
Und mit diesem kompiliert es!
Was passiert hier? Wer hat Recht? IDEA oder Java?
EDIT
Ich versuchte dies und es kompiliert:
((Funnel<FieldNode>) FieldNodeFunnel.INSTANCE).funnel(node, into);
Aber warum muss ich die Besetzung überhaupt?
Ich versuchte auch, wie dies eine „reguläre Singletons“ zu verwenden, und es auch Werke:
@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);
}
}
Ich frage mich, wie Sie in der Lage sind, 'private enum' zu haben. Ich kann das nicht erreichen, mein Compiler sagt immer "Illegal Modifier für den enum FieldNodeFunnel; nur public ist erlaubt" '. –
@HonzaZidek Diese Enumeration ist innerhalb der Utility-Klasse selbst definiert, nicht außerhalb davon – fge
@HonzaZidek aktualisierten Codebeispiel – fge