2014-10-07 49 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