【问题标题】:How do I add a generic type parameter to a class which I extend with JCodeModel?如何向使用 JCodeModel 扩展的类添加泛型类型参数?
【发布时间】:2016-07-01 13:28:34
【问题描述】:

我正在玩JCodeModel 并尝试生成一个类;感谢this link 我能够想出这个:

public final class CodeModelTest
{
    private CodeModelTest()
    {
        throw new Error("no instantiation is permitted");
    }

    public static void main(final String... args)
        throws JClassAlreadyExistsException, IOException
    {
        final JCodeModel model = new JCodeModel();

        final JDefinedClass c = model._class("foo.bar.Baz");
        c._extends(BaseParser.class);

        final JMethod method = c.method(JMod.PUBLIC, Rule.class, "someRule");

        method.body()._return(JExpr._null());

        final CodeWriter cw = new OutputStreamCodeWriter(System.out,
            StandardCharsets.UTF_8.displayName());

        model.build(cw);
    }
}

所以,这行得通。 stdout 上生成的代码是:

package foo.bar;

import com.github.fge.grappa.parsers.BaseParser;
import com.github.fge.grappa.rules.Rule;

public class Baz
    extends BaseParser
{
    public Rule someRule() {
        return null;
    }
}

到目前为止一切顺利。

现在,问题是我想extends BaseParser<Object> 而不是BaseParser...尽管谷歌搜索了好几个小时,但我无法弄清楚如何做到这一点...

我该怎么做?

【问题讨论】:

    标签: java sun-codemodel jcodemodel


    【解决方案1】:

    试试这个:

    JClass type = model.ref(BaseParser.class).narrow(Object.class);
    c._extends(type);
    

    希望这会有所帮助。

    【讨论】:

      【解决方案2】:

      需要在builder中调用narrow方法:

      喜欢

       c._extends(BaseParser.class).narrow(yourClassHere);
      

      【讨论】:

      • 没有骰子...至少在这里不起作用。它对你有用吗?
      • 好的,感谢您的帖子和其他阅读,我发现了。你真正想要的是缩小扩展类,而不是主要的。因此,解决方案是使用JCodeModel 实例来生成:model.ref(BaseParser.class).narrow(Object.class)
      猜你喜欢
      • 2023-02-23
      • 1970-01-01
      • 1970-01-01
      • 2018-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-14
      • 2012-07-24
      相关资源
      最近更新 更多