首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Sun Codemodel泛型方法调用

Sun Codemodel泛型方法调用
EN

Stack Overflow用户
提问于 2016-09-19 15:53:17
回答 1查看 220关注 0票数 1

我使用Codemodel库来生成java类。是否有一种方法可以生成如下所示的泛型方法调用:

代码语言:javascript
运行
复制
clazz.<String>get(value)

当然有一种方法可以使用下面的表达式将返回结果转换为正确的类型:

代码语言:javascript
运行
复制
JExpr.cast(stringType, clazz.invoke("get").arg(value))

这导致了

代码语言:javascript
运行
复制
(String) clazz.get(value)

但首选的强制转换方式是第一种,因为这段代码将生成模板,供开发人员进一步手动编辑。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-09-20 03:09:32

对于现有的JCodeModel应用程序接口,没有预先构建的方法来处理此问题。但是,您可以定义自己的JStatement类型来生成泛型声明,如下所示:

代码语言:javascript
运行
复制
    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();
        }
    });

这将生成:

代码语言:javascript
运行
复制
package org.test;

public class Tester {

    public void test() {
        Class clazz = getClass();
        clazz.<String >get();
    }
}

这绝不是一个完整的解决方案(例如,它缺少方法调用参数)。有关所需的详细信息,请看一下JInvocation中的generate()方法的实现。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39567984

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档