假设我的Type a
是java.util.TreeSet<T>
,已通过我们因类型擦除无法看到的通用参数化。我们还有一个Type b
,它是一个'java.lang.Integer'。如何构建ParameterizedType
的{{1}}?
或者,如果它更容易,我们可以使用原始java.util.TreeSet<java.lang.Integer>
类型。
答案 0 :(得分:1)
像这样实施ParameterizedType
:
public class MyParamType implements ParameterizedType {
private Type rawType;
private List<Type> paramTypes;
public MyParamType( Type raw ) {
this.rawType = raw;
}
public void addParamType( Type t ) {
paramTypes.add(t);
}
//for the interface methods, just return what you stored before
}
Type
或多或少相同。
如果你需要更多关于Type
应该为非泛型类型实现的更多提示(它只是一个标记接口),请查看JDK源代码或查看调试器中的具体实例。
答案 1 :(得分:0)
你给出了自己问题的一半答案。类型参数(在您的情况下为整数)是仅在编译时存在的擦除。因此,如果您想在开发代码时创建Set<Integer>
,您可以说:
Set<Integer> myset = new TreeSet<Integer>();
或者如果幸运的话,Java 7用户甚至更短:
Set<Integer> myset = new TreeSet<>();
然而,这一行将被编译为普通代码:
Set myset = new TreeSet();
因此,如果您想在运行时创建TreeSet<Integer>
的实例,则只需创建普通TreeSet
的实例,例如Class.forName(className).newInstance()
。在这种情况下,类型参数Integer
无关紧要。
编辑:
我刚看完你的评论,明白你为什么要问。如果您真的想要,可以创建TreeSet
:class IntegerTreeSet extends TreeSet<Integer>
的子类。可以使用反射API发现IntegerTreeSet
的参数类型。
可以静态创建此类(只需在代码中编写)或使用Javassist或CGLIB等工具动态创建。