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()]);