In primo luogo, un po 'di ambiente: questo è il JDK 1.6.0_45 di Oracle e IDEA 13.1.Bug nel compilatore o sto facendo qualcosa di sbagliato?
ho inciampato su un errore di compilazione più bizzarra:
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
e PrimitiveSink
sono da Guava; per quanto riguarda FieldNode, è da ASM 5.0.1 (org.objectweb.asm.tree.FieldNode
).
Nota che uso IDEA (13.1 se ciò è importante). Ora, in un primo momento, ho avuto un metodo definito in questo modo:
public static void funnelFieldNode(final FieldNode node,
final PrimitiveSink into)
{
FieldNodeFunnel.INSTANCE.funnel(node, into);
}
IDEA mostrano nessun avviso ... Ma il compilatore non è felice:
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
Linea 53 è questa:
FieldNodeFunnel.INSTANCE.funnel(node, into);
Questo è il più bizzarro, non vedo perché. E poi ho fatto questo:
private static Funnel<FieldNode> fieldNodeFunnel()
{
return FieldNodeFunnel.INSTANCE;
}
public static void funnelFieldNode(final FieldNode node,
final PrimitiveSink into)
{
fieldNodeFunnel().funnel(node, into);
}
E con questo, compila!
Cosa sta succedendo qui? Chi ha ragione? IDEA o javac?
EDIT
Ho provato questo, e si compila:
((Funnel<FieldNode>) FieldNodeFunnel.INSTANCE).funnel(node, into);
Ma perché ho bisogno del cast a tutti?
Ho anche cercato di usare un "Singleton regolare" come questo ed è anche opere:
@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);
}
}
Mi chiedo come sia possibile avere "enum privato". Non riesco a raggiungerlo, il mio compilatore dice sempre "Modificatore non valido per l'enum FieldNodeFunnel, solo il pubblico è permesso" ". –
@HonzaZidek questo enum è definito all'interno della classe di utilità stessa, non al di fuori di esso – fge
@HonzaZidek codice di esempio aggiornato – fge