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

fab*_*ian 5 java code-generation netbeans-platform netbeans-8

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

我正在为此目的使用该NewClass方法

例子:

给定输入java.util.ArrayListjava.lang.Integer生成的代码应该类似于:

import java.util.ArrayList;

...

new ArrayList<Integer>();
Run Code Online (Sandbox Code Playgroud)

如果输入是java.util.ArrayListjava.util.List<java.lang.Integer>并且生成的代码应该类似于:

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

...

new ArrayList<List<Integer>>();
Run Code Online (Sandbox Code Playgroud)

(类型参数列表存储为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);
    
    Run Code Online (Sandbox Code Playgroud)

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

  2. 通过typeArgumentsNewClass

    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);
    
    Run Code Online (Sandbox Code Playgroud)

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

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