Codemodel: генерация универсальных типов в цикле.narrow()?

Я использую sun-codemodel для генерации кода. У меня проблема с дженериками. Я знаю, что генерировать что-то вроде

LinkedList<String>,

Мне нужно использовать

JType jtype = jCodeModel.ref("LinkedList").narrow(jCodeModel.ref("String"));

Тем не менее, как я могу создать что-то более общее для более чем одного универсального типа?

HashMap<String,Integer>

Я хотел бы сделать это в цикле, чтобы он поддерживал любое количество аргументов в пользовательских классах, но для такого кода:

for(String name: names()){
  returnTypeClass = jCodeModel.ref(name).narrow(jCodeModel.ref(name));
}

результат примерно такой:

JNarrowedClass(JCodeModel$JReferencedClass(HashMap)<Integer>)<String>

1 ответ

Решение

Я незнаком с CodeModel, но, глядя на документацию по API, кажется, что есть перегрузка varargs: narrow(JClass...), Предположительно это используется для разрешения нескольких параметров типа. Так что в случае HashMap<String, Integer>, вы бы сделали:

JType jtype = jCodeModel.ref("HashMap").narrow(
        jCodeModel.ref("String"),
        jCodeModel.ref("Integer")
);

И обобщая это в вашем цикле:

Collection<JClass> typeArgClasses = new ArrayList<>();
for (String name : names()) {
    typeArgClasses.add(jCodeModel.ref(name));
}
JType jtype = jCodeModel
        .ref(typeName)
        .narrow(typeArgClasses.toArray(new JClass[typeArgClasses.size()]);
Другие вопросы по тегам