2014-10-07 81 views
0

我要生成象下面這樣一些代碼:如何縮小匿名類?

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

我試過如下:下面

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

了異常,造成「anonymousSomeClass.narrow(JCLASS)」。如果我刪除'.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 2014-10-08 05:38:16

+0

重複進口是什麼意思?我看到一個導入,但是一個AbstractSomeClass被全包名稱引用。當然,Codemodel並不知道生成最漂亮的結果。 – 2014-10-08 13:59:40

+0

嗨jonhcarl。謝謝。在我生成的源文件中有多個'import test.Tester.AbstractSomeClass'。我想你只能在一個地方使用它。我在不同狹窄類型的幾個地方使用了anonymousClass。但這並不重要,因爲無論如何都不會產生任何語法錯誤,只是重複導入。謝謝你的幫助。 – Cheng 2014-10-09 01:05:11