Java 如何获取参数化类型

Java 如何获取参数化类型,java,generics,reflection,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(),

请按照代码片段进行操作

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];
}

}
公共A类{
私有T泛型实例(){
T目标=null;
试一试{
类clazz=getGenericClass();
target=clazz.newInstance();
}捕获(例外e){
log.error(e.getMessage(),e);
}
回报目标;
}
@抑制警告(“未选中”)
私有类getGenericClass(){
ParameteredType type=(ParameteredType)getClass().getGenericSuperclass();
Type[]types=Type.getActualTypeArguments();
返回(类)类型[0];
}
}

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

由于类型擦除,您需要
T
的实例(或传入
)。Java泛型只提供编译时类型检查,在运行时泛型的类型为
Object
。实际上,这并不困难,因为您在编译时知道类型
T
;例如,
aa=newa(Integer.class);//Integer.class与其他整数匹配

公共A类{
私人课堂;
公共A(课堂){
this.clazz=clazz;
}
公共T通用语句(){
T目标=null;
试一试{
//类clazz=getGenericClass();
target=clazz.newInstance();
}捕获(例外e){
log.error(e.getMessage(),e);
}
回报目标;
}
}

为了了解T,需要在类型定义中声明它。下面是一个示例,使用:

//声明一个提供字符串作为T参数的类型
类StringA扩展了{}
//解决问题
Class t=TypeResolver.resolveRawArgument(A.Class,StringA.Class);
断言t==String.class;
假设已在类型定义上声明了T,则可以在以下的实现中解析它:

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

那么为什么要调用
getGenericSuperclass()
genericInstance()
满足您的要求。在这个过程中,我应该通过
T
类来实例化
T
,但我足够空闲,无法通过'T'类或'T'实例。我想要动态地得到它,这是我的问题。我想要克里斯蒂娜·亨德里克斯,地球上的和平和诚实的政治家。但她说不,人们不能相处,政客们撒谎。这就是生活。@ShahedHossain你的要求是不可能的,因为;相比之下,我的清单只是不太可能。
// 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;
Class<?> t = TypeResolver.resolveRawArgument(A.class, getClass());