![](/img/trans.png)
[英]Is this a bug in the Jackson JsonParser, or am I doing something wrong?
[英]Bug in compiler or am I doing something wrong?
首先,一些环境:这是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
来自番石榴; 至于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);
}
}
它似乎是一个重复项 - 带接口的Enum类成员无法在内部找到方法 。
JDK-6中可能存在一个错误 - 请参阅:
enum实现接口的编译结果不一致https://bugs.openjdk.java.net/browse/JDK-7049773
作为源文件输入的枚举类的方法解析不正确https://bugs.openjdk.java.net/browse/JDK-6724345 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.