Как сузить анонимный класс?
Я хочу сгенерировать код, как показано ниже:
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)
...
Благодарю.
1 ответ
Решение
Это похоже на ошибку в способе 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>() {
}
;
}