Java中定义泛型<T>时,怎么获得泛型的类型

如题所述

T.getClass()或者T.class都是非法的,因为T是泛型变量。
由于一个类的类型是什么是在编译期处理的,故不能在运行时直接在Base里得到T的实际类型。
有一种变通的实现方式:
import java.lang.reflect.Array;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;

public class Generic extends Base<String> {
public static void main(String[] args) {
Generic c = new Generic();
System.out.println(c.array);
}

Object array ;
public Generic() {
array = Array.newInstance(getGenericType(0), 100);
}
}

class Base<T> {
public Class getGenericType(int index) {
Type genType = getClass().getGenericSuperclass();
if (!(genType instanceof ParameterizedType)) {
return Object.class;
}
Type[] params = ((ParameterizedType) genType).getActualTypeArguments();
if (index >= params.length || index < 0) {
throw new RuntimeException("Index outof bounds");
}
if (!(params[index] instanceof Class)) {
return Object.class;
}
return (Class) params[index];
}
}
其中Base<T>是泛型类,在父类中声明getGenericType,子类继承具体的Base<String>,那么在子类中就可以通过getGenericType(0)获取到String的class.
温馨提示:内容为网友见解,仅供参考
无其他回答

Java中定义泛型<T>时,怎么获得泛型的类型
T.getClass()或者T.class都是非法的,因为T是泛型变量。由于一个类的类型是什么是在编译期处理的,故不能在运行时直接在Base里得到T的实际类型。有一种变通的实现方式:import java.lang.reflect.Array;import java.lang.reflect.ParameterizedType;import java.lang.reflect.Type;public class Generic ex...

Java中如何获得A<T>泛型中T的运行时类型及原理探究
尽管有缺陷,我们仍可通过一些技巧在工具类中获取泛型的运行时类型,如在序列化框架中的TypeReference。关键在于理解,Java编译器将泛型信息存储在ClassFile的Signature属性中,通过JRE反射API解析这个信息。具体来说,javac编译过程会将泛型信息写入到ClassSymbol的type变量,并在ClassFile的Signature中体现,如在...

JAVA 中<t>是什么意思,
JAVA 中<t>是泛型的意思。意思是Tree这个类里面需要用到另外一个类,但是又不能确定要用到的那个类的具体类型,所以暂时用T来代替。当具体的程序知道要用到的那个类型是什么的时候就用那个类型来代替T,例如需要实例化一个Tree类,需要用到的那个类是String,那么就可以这么来实例化Tree<String>()。

java 里 泛型中 <T>代表什么类型呀?
你好,我给你说一下:这种是jdk1.5引入的泛型机制,没有T这种类型,T是根据你输入的来动态匹配。加入你集合放入的String类型,那么你就可以使用List<String>,然后代码中所有出现T的地方都用String代替就可以了 ,放入的是Object类型,那么你就用List<Object>,同理。

Java泛型 | Jackson TypeReference获取泛型类型信息
Type 类型的对象,该对象准确反映了源代码中使用的实际类型参数。Class 的 genericInfo 属性 在获取到 ParameterizedType 后,通过调用 getActualTypeArguments 方法,可以获得泛型参数的实际类型。这样,即使在编译时无法显式指定类型参数,通过 TypeReference 也可以在运行时获取和使用泛型信息。总结 ...

java中如何得到泛型参数的class?
泛型的类型是无法在运行时通过反射取得的,泛型类型在编译成字节码的时候已经被虚拟机给去掉了,只是起到提示编译器进行类型检查的作用用这种方法你试一试:父类:import java.lang.reflect.ParameterizedType;public class Parent<T {public Parent() {ParameterizedType type = (ParameterizedType)this.getClass(...

java中如何得到泛型参数的class?
泛型的类型是无法在运行时通过反射取得的,泛型类型在编译成字节码的时候已经被虚拟机给去掉了,只是起到提示编译器进行类型检查的作用 用这种方法你试一试:父类:import java.lang.reflect.ParameterizedType;public class Parent<T { public Parent() { ParameterizedType type = (ParameterizedType)this.get...

Java中的泛型的问题?
\/\/转换成有泛型的ParameterizedType类 ParameterizedType parameterizedType=(ParameterizedType)clazz.getGenericSuperclass();\/\/上面三句其实就是为了获取BaseDao类本身 Type[] types = parameterizedType.getActualTypeArguments();this.type=(Class<T>)types[0];\/\/上面两句是获取运行期的泛型类型,返回给当前...

java中<T>问题
1) 在定义一个泛型类的时候,在“<>”之间定义形式类型参数,例如:“class TestGen<K,V>”,其中“K” , “V”不代表值,而是表示类型。 2) 实例化泛型对象的时候,一定要在类名后面指定类型参数的值(类型),一共要有两次书写。例如:TestGen<String,String> t=new TestGen<String,String>(); 3) 泛型中<...

JAVA中的泛型用法一种: <T> 返回值用法。
1、对于泛型方法来说,是可以接收不同类型的参数,比如下图,使用泛型来操作List集合,然后向List中添加一条数据,看是否可以添加成功,创建泛型方法如图所示。2、然后在写一个main方法来测试一下这个泛型方法,先向集合中添加一条String类型的数据,打印List集合中的元素,如图所示。3、上面是往List集合...

相似回答