먼저, 일부 환경 : 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);
}
}
'개인 열거 형'을 어떻게 가질 수 있는지 궁금합니다. 나는이 문제에 접근 할 수 없다. 컴파일러는 항상 ""열거 형 FieldNodeFunnel에 대한 불법적 인 수정 자, public만이 허용된다 "라고 말한다. –
@HonzaZidek이 열거 형은 유틸리티 클래스 자체 내에서 정의됩니다. – fge
@HonzaZidek 업데이트 된 코드 샘플 – fge