2014-10-07 9 views
0

내가 몇 가지 코드를 아래와 같이 생성 할 :익명의 클래스를 좁히는 방법은 무엇입니까?

JDefinedClass anonymousSomeClass = codeModel.anonymousClass(AbstractSomeClass.class); 
... 
conditionalBody.decl(anonymousSomeClass, "someClassObj", JExpr._new(anonymousSomeClass.narrow(jClass))); 

있어 예외 아래, 'anonymousSomeClass.narrow (JCLASS)'에 의해 발생 :

AbstractSomeClass<?> someClassObj = new AbstractSomeClass<MyConcreteType> { 
    ... 
} 

나는 다음 시도했다. .narrow (jClass) '를 제거하면 모든 것이 잘됩니다.

java.lang.NullPointerException 
    at com.sun.codemodel.JDefinedClass.outer(JDefinedClass.java:776) 
    at com.sun.codemodel.JFormatter.t(JFormatter.java:280) 
    at com.sun.codemodel.JNarrowedClass.generate(JNarrowedClass.java:143) 
    at com.sun.codemodel.JFormatter.g(JFormatter.java:350) 
    at com.sun.codemodel.JInvocation.generate(JInvocation.java:173) 
    at com.sun.codemodel.JFormatter.g(JFormatter.java:350) 
    at com.sun.codemodel.JVar.bind(JVar.java:212) 
    at com.sun.codemodel.JFormatter.b(JFormatter.java:396) 
    at com.sun.codemodel.JVar.declare(JVar.java:216) 
     ... 

감사합니다.

답변

2

이것은 CodeModel이 익명 클래스와 소유권을 처리하는 방식의 버그 인 것 같습니다.

JDefinedClass tester = codeModel._class("Tester"); 

    JClass jClass = codeModel.ref(Reference.class); 
    JClass unnarrowed = codeModel.ref(AbstractSomeClass.class).narrow(codeModel.wildcard()); 
    JClass narrowed = codeModel.ref(AbstractSomeClass.class).narrow(jClass); 

    JClass anonymous = codeModel.anonymousClass(narrowed); 

    tester.field(JMod.PUBLIC, unnarrowed, "someClassObj", JExpr._new(anonymous)); 

가 부여

:

import test.Tester.AbstractSomeClass; 

public class Tester { 

    public test.Tester.AbstractSomeClass<?> someClassObj = new AbstractSomeClass<Reference>() { 


    } 
    ; 

} 
+0

감사 많은이 주위에 방법은 익명의 유형으로 취급하기 전에 클래스를 좁힘으로써, 그러나이있다. 결과는 정확하지만 결과 소스 코드에는 AbstractSomeClass의 여러 중복 가져 오기가 포함됩니다. 당신이 말했듯이, 이것이 CodeModel의 버그 일 수 있다고 생각합니다. – Cheng

+0

중복 된 수입은 무엇을 의미합니까? 하나의 가져 오기가 표시되지만 하나의 AbstractSomeClass는 전체 패키지 이름으로 참조됩니다. 물론, Codemodel은 가장 뛰어난 결과를 생성하는 것으로 알려져 있지 않습니다. –

+0

안녕하세요 jonhcarl. 감사. 생성 된 소스 파일에는 여러 개의 'import test.Tester.AbstractSomeClass'가 있습니다. 나는 당신이 한 곳에서만 그것을 사용한다고 생각합니다. 다른 좁은 유형의 여러 위치에서 anonymousClass를 사용했습니다. 하지만 그건 중요하지 않습니다. 어쨌든 구문 오류가 없기 때문에 수입이 중복됩니다. 당신의 도움을 주셔서 감사합니다. – Cheng