![](/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.