关于Java泛型的类型擦除机制问题求教

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于Java泛型的类型擦除机制问题求教相关的知识,希望对你有一定的参考价值。

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
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
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是泛型类,在父类中声明getGenericType,子类继承具体的Base,那么在子类中就可以通过getGenericType(0)获取到String的class.
参考技术A 返回T即可。

以上是关于关于Java泛型的类型擦除机制问题求教的主要内容,如果未能解决你的问题,请参考以下文章

深入理解 Java 泛型擦除机制

Java泛型之类型擦除

理解Java泛型和类型擦除

java泛型泛型的内部原理:类型擦除以及类型擦除带来的问题

java泛型 泛型的内部原理:类型擦除以及类型擦除带来的问题

泛型的内部原理:类型擦除以及类型擦除带来的问题