2014-10-07 2 views
0

я хочу, чтобы создать какой-то код, как показано ниже:Как сузить анонимный класс?

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

Я попытался следующие:

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

Got исключение ниже, вызванное «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

+0

Что вы подразумеваете под дублированным импортом? Я вижу один импорт, но на один объект AbstractSomeClass ссылается полное имя пакета. Конечно, Codemodel не известен для создания самых красивых результатов. –

+0

Привет jonhcarl. Благодарю. В моих сгенерированных исходных файлах есть несколько «import test.Tester.AbstractSomeClass». Я думаю, вы используете его только в одном месте. Я использовал anonymousClass в нескольких местах с различными узкими типами. Но это не имеет значения, поскольку в любом случае это не дает никаких синтаксических ошибок, просто дублирует импорт. Спасибо за вашу помощь. – Cheng

Смежные вопросы