如何获取参数化类型

时间:2014-01-01 05:16:58

标签: java generics reflection

请按照代码段

进行操作
public class A<T> {

private T genericInstance() {
    T target = null;
    try {
        Class<T> clazz = getGenericClass();
        target = clazz.newInstance();
    } catch (Exception e) {
        log.error(e.getMessage(), e);
    }
    return target;
}

@SuppressWarnings("unchecked")
private Class<T> getGenericClass() {
    ParameterizedType type = (ParameterizedType) getClass().getGenericSuperclass();
    Type[] types = type.getActualTypeArguments();
    return (Class<T>) types[0];
}

}

当我执行代码getGenericClass()时,它返回Generic Super类,但我的要求是获取T类,并希望动态实例化它。

2 个答案:

答案 0 :(得分:3)

由于类型擦除,您需要T的实例(或传递class)。 Java泛型仅提供编译时类型检查,在运行时,泛型类型为Object。在实践中,这并不困难,因为您在编译时知道类型T;例如,A<Integer> a = new A<Integer>(Integer.class); // Integer.class matches the other Integer(s)

public class A<T> {
  private Class<T> clazz;

  public A(Class<T> clazz) {
    this.clazz = clazz;
  }

  public T genericInstance() {
    T target = null;
    try {
      // Class<T> clazz = getGenericClass();
      target = clazz.newInstance();
    } catch (Exception e) {
      log.error(e.getMessage(), e);
    }
    return target;
  }
}

答案 1 :(得分:2)

为了学习T,需要在类型定义上声明它。以下是使用TypeTools

的示例
// Declare a type that supplies String as an argument for T
class StringA extends A<String> {}

// Resolve T
Class<?> t = TypeResolver.resolveRawArgument(A.class, StringA.class);
assert t == String.class;

假设已在类型定义上声明了T,您可以在A的实现中解决它:

Class<?> t = TypeResolver.resolveRawArgument(A.class, getClass());