简体   繁体   中英

How to generate a generic method with JCodeModel?

I need to generate a generic method like

public static <T extends SomeObject> T get(Class<T> type) {
    ...
    return null;
}

Anybody done this before?

The key is the JMethod#generify method:

import com.sun.codemodel.CodeWriter;
import com.sun.codemodel.JClass;
import com.sun.codemodel.JCodeModel;
import com.sun.codemodel.JDefinedClass;
import com.sun.codemodel.JExpr;
import com.sun.codemodel.JMethod;
import com.sun.codemodel.JMod;
import com.sun.codemodel.JPackage;
import com.sun.codemodel.JType;
import com.sun.codemodel.writer.SingleStreamCodeWriter;

public class CreateGenericMethodTest
{
    public static void main(String[] args) throws Exception
    {
        JCodeModel codeModel = new JCodeModel();
        JPackage jpackage = codeModel._package("com.example");
        JDefinedClass jclass = jpackage._class("Example");

        JType genericType = codeModel.directClass("T");
        JMethod jmethod =
            jclass.method(JMod.PUBLIC | JMod.STATIC, genericType, "get");
        jmethod.generify("T", Number.class);
        JClass parameterType = codeModel.ref(Class.class).narrow(genericType);
        jmethod.param(parameterType, "type");

        jmethod.body()._return(JExpr.ref("null"));
        CodeWriter codeWriter = new SingleStreamCodeWriter(System.out);
        codeModel.build(codeWriter);
    }
}

Output:

package com.example;

public class Example {

    public static<T extends Number >T get(Class<T> type) {
        return null;
    }

}

(I used Number as the bound, but you can choose it arbitrarily)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM