【发布时间】:2014-04-27 14:15:15
【问题描述】:
首先,一些环境:这是 Oracle 的 1.6.0_45 JDK,和 IDEA 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 来自 Guava; FieldNode 来自 ASM 5.0.1 (org.objectweb.asm.tree.FieldNode)。
请注意,我使用的是 IDEA(如果这很重要,则为 13.1)。现在,起初,我有一个这样定义的方法:
public static void funnelFieldNode(final FieldNode node,
final PrimitiveSink into)
{
FieldNodeFunnel.INSTANCE.funnel(node, into);
}
IDEA 不显示任何警告...但是编译器不高兴:
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);
}
这样,它就可以编译了!
这里发生了什么?谁是对的? IDEA 还是 javac?
编辑
我试过了,它可以编译:
((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);
}
}
【问题讨论】:
-
我想知道你怎么能拥有
private enum。我无法做到这一点,我的编译器总是说"Illegal modifier for the enum FieldNodeFunnel; only public is permitted"。 -
@HonzaZidek 这个枚举是在实用程序类本身中定义的,而不是在它之外
-
@HonzaZidek 更新代码示例
标签: java compiler-construction intellij-idea javac