使用类型参数生成构造函数调用

时间:2016-02-11 15:54:19

标签: java code-generation netbeans-8 netbeans-platform

我想使用TreeMaker为我的netbeans代码生成器插件中的类型参数类型生成构造函数调用。另外,我想导入类型而不是使用完全限定名称(参见QualIdent)。

我正在使用NewClass method来实现此目的。

实施例

鉴于输入java.util.ArrayListjava.lang.Integer,生成的代码应与此类似:

import java.util.ArrayList;

...

new ArrayList<Integer>();

如果输入为java.util.ArrayListjava.util.List<java.lang.Integer>,则生成的代码应与此类似:

import java.util.ArrayList;
import java.util.List;

...

new ArrayList<List<Integer>>();

(类型参数列表存储为List<? extends TypeMirror>

如何生成所需的输出?

到目前为止我尝试了什么:

makerTreeMaker个实例)

  1. 将类型名称转换为字符串:

    String className = "java.util.ArrayList<java.util.List<java.lang.Integer>>"; // actually computed in real code
    
    maker.NewClass(null,
                   Collections.<ExpressionTree>emptyList(),
                   maker.QualIdent(className),
                   Collections.<ExpressionTree>emptyList(),
                   null);
    

    这会产生语法/语义上正确的java代码,但使用完全限定的类名,即new java.util.ArrayList<java.util.List<java.lang.Integer>>()

  2. typeArguments传递给NewClass

    List<ExpressionTree> typeArguments = Collections.singletonList(maker.QualIdent("java.lang.Integer")); // actually computed in real code
    
    maker.NewClass(null,
            typeArguments,
            maker.QualIdent("java.util.ArrayList"),
            Collections.<ExpressionTree>emptyList(),
            null);
    

    这会导入ArrayList,但类型参数会在new关键字后直接添加,即生成new <Integer>ArrayList(),这是错误的。

  3. 使用ParameterizedTypeTree作为类型的标识符,这不起作用,因为TreeMaker需要类型ExpressionTree的参数,但这不是{{的超类型1}}。

0 个答案:

没有答案