2014-04-27 2 views
11

먼저, 일부 환경 : 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); 
      } 
     } 
    } 

    //... 

} 

FunnelPrimitiveSink는 구아바에서이다; 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); 
    } 
} 
+0

'개인 열거 형'을 어떻게 가질 수 있는지 궁금합니다. 나는이 문제에 접근 할 수 없다. 컴파일러는 항상 ""열거 형 FieldNodeFunnel에 대한 불법적 인 수정 자, public만이 허용된다 "라고 말한다. –

+0

@HonzaZidek이 열거 형은 유틸리티 클래스 자체 내에서 정의됩니다. – fge

+0

@HonzaZidek 업데이트 된 코드 샘플 – fge

답변

관련 문제