Codemodel:循环中的泛型类型生成.narrow()?

时间:2013-07-23 09:18:10

标签: java generics code-generation sun-codemodel

我正在使用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 个答案:

答案 0 :(得分:4)

我不熟悉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()]);