Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 给定参数化类型和类型,如何重新参数化第一个类型?_Java_Reflection - Fatal编程技术网

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
}