给定ParameterizedType和Type,如何重新参数化第一种类型?

时间:2012-12-11 08:15:46

标签: java reflection

假设我的Type ajava.util.TreeSet<T>,已通过我们因类型擦除无法看到的通用参数化。我们还有一个Type b,它是一个'java.lang.Integer'。如何构建ParameterizedType的{​​{1}}?

或者,如果它更容易,我们可以使用原始java.util.TreeSet<java.lang.Integer>类型。

2 个答案:

答案 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无关紧要。

编辑: 我刚看完你的评论,明白你为什么要问。如果您真的想要,可以创建TreeSetclass IntegerTreeSet extends TreeSet<Integer>的子类。可以使用反射API发现IntegerTreeSet的参数类型。

可以静态创建此类(只需在代码中编写)或使用Javassist或CGLIB等工具动态创建。