Java 给定参数化类型和类型,如何重新参数化第一个类型?
假设我有一个Java 给定参数化类型和类型,如何重新参数化第一个类型?,java,reflection,Java,Reflection,假设我有一个类型a,它是一个java.util.TreeSet,通过一个泛型进行了参数化,由于类型擦除,我们无法看到它。我们还有一个类型b,它是一个“java.lang.Integer”。如何构造参数化类型,即java.util.TreeSet 或者,如果更简单的话,我们可以使用原始的java.util.TreeSet类型。您对自己的问题给出了一半的答案。类型参数(在本例中为整数)是仅在编译时存在的擦除。因此,如果您想在开发代码时创建Set,只需说: Set<Integer> mys
类型a
,它是一个java.util.TreeSet
,通过一个泛型进行了参数化,由于类型擦除,我们无法看到它。我们还有一个类型b
,它是一个“java.lang.Integer”。如何构造参数化类型
,即java.util.TreeSet
或者,如果更简单的话,我们可以使用原始的
java.util.TreeSet
类型。您对自己的问题给出了一半的答案。类型参数(在本例中为整数)是仅在编译时存在的擦除。因此,如果您想在开发代码时创建Set
,只需说:
Set<Integer> myset = new TreeSet<Integer>();
因此,如果您想在运行时创建TreeSet
的实例,只需创建普通TreeSet
的实例,例如Class.forName(className).newInstance()
。在这种情况下,类型参数Integer
不相关
编辑:
我刚刚读了你的评论,明白你为什么要问。如果确实需要,可以创建TreeSet
的子类:类IntegerTreeSet扩展TreeSet
。可以使用反射API发现IntegerTreeSet
的参数类型
此类可以静态创建(只需在代码中编写),也可以使用Javassist或CGLIB等工具动态创建。实现
参数化类型
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
}
公共类MyParamType实现ParameteredType{
私有类型;
私有列表类型;
公共MyParamType(原始类型){
this.rawType=raw;
}
公共void addParamType(类型t){
参数类型。添加(t);
}
//对于接口方法,只需返回之前存储的内容
}
对类型执行大致相同的操作。
如果您需要更多关于Type
应该为非泛型类型实际实现什么的提示(它只是一个标记接口),请查看JDK源代码或调试器中的具体实例。问题是您希望如何处理Type和ParameterizedType对象。原则上,这些都是通过对相应对象的反射得到的。我根本不关心普通的Type
对象。我需要ParameterizedType
传递给gson以反序列化集合。这是Not Quality的副本。在这种情况下,两种类型都是在编译时设置的。就我而言,两者都不是。事实上,我在发布我的问题之前发现了这个问题。你介意发布一个如何回答的答案吗?我重新阅读了答案,没有看到适用性。我实际上不想实例化它——我只想要一个类型对象来描述它。关于编辑,我对Integer和TreeSet的选择是任意的。参数化类型
可以描述任何集合,类型
可以描述任何对象。
Set myset = new TreeSet();
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
}