获得泛型(generic class)参数类型T的实际类型(actual type)
2017-01-15 12:14
2521 查看
如果想获得泛型(generic class)参数类型T,有可能会使用如下代码:
获得当前类(你new的)的直接基类的实际泛型参数类型;
但是你有可能会遇到如下两种异常:
new 出来的object不是泛型,转换为
如果想获得实际类型,应该这么做:new 泛型类的匿名内部类,如下:
之后调用
结果:
如果省略了
下面的代码:
如此调用
正确的做法是
Class<T> tClass = (Class<T>)((ParameterizedType)getClass().getGenericSuperclass()) .getActualTypeArguments()[0];
获得当前类(你new的)的直接基类的实际泛型参数类型;
但是你有可能会遇到如下两种异常:
1.java.lang.ClassCastException: libcore.reflect.TypeVariableImpl cannot be cast to java.lang.Class 2.java.lang.ClassCastException: java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType
new 出来的object不是泛型,转换为
ParameterizedType将会抛异常2,
getActualTypeArguments(),想获得实际传入的类型,则实际类型T需要传给此类;
如果想获得实际类型,应该这么做:new 泛型类的匿名内部类,如下:
class Atest<T> { public Atest() { Class<T> t = (Class<T>)((ParameterizedType)getClass().getGenericSuperclass()) .getActualTypeArguments()[0]; Log.i("t is:" + t); } }
之后调用
new Atest<String>(){};
结果:
t is:class java.lang.String
如果省略了
{},则Atest的直接基类就是
object了
下面的代码:
class ATest<T> { public ATest() { Log.i("ATest"); } } class BTest<T> extends ATest<T> { public BTest() { .getActualTypeArguments()[0]; Log.i("t is:" + t); } } new BTest<String>();
如此调用
getGenericSuperclass()获得的是ATest,它是
ParameterizedType类型,但由于实际类型传入的是BTest,ATest的Parameter是T,不是实际类型,会报异常1
正确的做法是
new BTest<String>(){};
相关文章推荐
- 根据java编译器规则在Class中搜索匹配指定参数类型表的泛型方法(GenericMethod)
- Class的 getSuperclass与getGenericSuperclass区别和如何获取泛型参数类型
- 43_通过反射获得泛型的实际类型参数
- java_通过反射获得泛型的实际类型参数
- 泛型(Generic):了解泛型、泛型的应用、?通配符和泛型的限定、泛型方法和类型推断、泛型类、用反射获得实际
- 反射获得泛型的实际类型参数
- 获得超类的泛型参数的实际类型
- 泛型学习-通过反射获得泛型的实际类型参数
- 获得父类中的泛型参数的实际类型
- 通过反射获得泛型的实际类型参数
- java反射获得泛型参数getGenericSuperclass():获取到父类泛型的类型
- 通过反射获得泛型的实际类型参数
- Java泛型学习-获得泛型的实际参数类型
- java 通过反射获得泛型的实际类型参数
- Java 泛型学习(三)通过反射获得泛型的实际类型参数
- 43 通过反射获得泛型的实际类型参数
- [javase]获得超类的泛型参数的实际类型
- 通过反射获得泛型的实际类型参数
- 反射==>获得泛型的实际类型参数
- 通过反射获得泛型的实际类型参数