我使用Codemodel库来生成java类。是否有一种方法可以生成如下所示的泛型方法调用:
clazz.<String>get(value)当然有一种方法可以使用下面的表达式将返回结果转换为正确的类型:
JExpr.cast(stringType, clazz.invoke("get").arg(value))这导致了
(String) clazz.get(value)但首选的强制转换方式是第一种,因为这段代码将生成模板,供开发人员进一步手动编辑。
发布于 2016-09-20 03:09:32
对于现有的JCodeModel应用程序接口,没有预先构建的方法来处理此问题。但是,您可以定义自己的JStatement类型来生成泛型声明,如下所示:
    JDefinedClass definedClass = codeModel._class(JMod.PUBLIC, "org.test.Tester", ClassType.CLASS);
    JMethod method = definedClass.method(JMod.PUBLIC, codeModel.VOID, "test");
    final JType targetType = codeModel.ref(String.class);
    final JVar clazzVar = method.body().decl(codeModel.ref(Class.class), "clazz", JExpr.invoke("getClass"));
    method.body().add(new JStatement(){
        @Override
        public void state(JFormatter f) {
            f.g(clazzVar).p(".<").g(targetType).p(">").p("get").p("();").nl();
        }
    });这将生成:
package org.test;
public class Tester {
    public void test() {
        Class clazz = getClass();
        clazz.<String >get();
    }
}这绝不是一个完整的解决方案(例如,它缺少方法调用参数)。有关所需的详细信息,请看一下JInvocation中的generate()方法的实现。
https://stackoverflow.com/questions/39567984
复制相似问题