我想使用TreeMaker
为我的netbeans代码生成器插件中的类型参数类型生成构造函数调用。另外,我想导入类型而不是使用完全限定名称(参见QualIdent
)。
我正在使用NewClass
method来实现此目的。
鉴于输入java.util.ArrayList
和java.lang.Integer
,生成的代码应与此类似:
import java.util.ArrayList;
...
new ArrayList<Integer>();
如果输入为java.util.ArrayList
且java.util.List<java.lang.Integer>
,则生成的代码应与此类似:
import java.util.ArrayList;
import java.util.List;
...
new ArrayList<List<Integer>>();
(类型参数列表存储为List<? extends TypeMirror>
)
如何生成所需的输出?
(maker
是TreeMaker
个实例)
将类型名称转换为字符串:
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>>()
将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()
,这是错误的。
使用ParameterizedTypeTree
作为类型的标识符,这不起作用,因为TreeMaker
需要类型ExpressionTree
的参数,但这不是{{的超类型1}}。