泛型 反射 分析

1、

     Type

     它是所有类型的公共接口。包括原始类型、参数化类型、数组类型、类型变量和基本类型。 ParameterizedType, TypeVariable, WildcardType,GenericArrayType 这四个接口都是它的子接口。
     GenericDeclaration
     这个接口 Class Method Constructor 都有实现,我们就是要用这个接口的 getTypeParameters 方法,它返回一个 TypeVariable[] 数组,这个数组里面就是我们定义的类型变量 T K ,顺序与我们声明时一样。如果用循环语句将数组打印出来,你会发现只会输出 T K ,这可不是我们想要的结果,那么想要获得预期的结果怎么办呢?请继续往下看。
     TypeVariable
     它表示类型变量。比如 T ,比如 extends   Comparable<?  super   T> & Serializable ,这个接口里面有个 getBounds () 方法,它用来获得类型变量上限的 Type 数组,如果没有定义上限,则默认设定上限为 Object ,请注意 TypeVariable 是接口,实际得到的是 TypeVariableImpl 实现类,下面几个接口都一样。
     TK来说明,T没有定义任何上限,所以它就有一个默认上限java.lang.Object,实际跟踪代码的时候你会发现Tbounds属性为空,只有在调用了getBounds()方法后,才会有一个Type[1]数组[class java.lang.Object]。而对于K来说,调用了getBounds方法后,得到的数组是[java.lang.Comparable<? super T>, interface java.io.Serializable],它们的类型却是不一样的,第1个是ParameterizedType,而第二个是Class
    ParameterizedType
    ParameterizedType表示参数化类型,就是上面说的java.lang.Comparable<? super T>,再比如List<T>List<String>,这些都叫参数化类型。得到Comparable<? super T>之后,再调用getRawType()getActualTypeArguments()两个方法,就可以得到声明此参数化类型的类(java.lang.Comparable)和实际的类型参数数组([? super T]),而这个? super T又是一个WildcardType类型。
    WildcardType
     它用来描述通配符表达式,上面返回的 ? super T 正好是这个类型。然后调用 getUpperBounds() 上限和 getLowerBounds() 下限这两个方法,获得类型变量 ? 的限定类型 ( 上下限 ) ,对于本例的通配符 (?) ,它的上限为 java.lang.Object ,下限为 T

通过上面几个接口的分析,可以将Person类的泛型参数都解析出来,那么Person的超类以及实现的接口该怎么处理呢?Class类里面同样在1.5版本加入了getGenericSuperclass()getGenericInterfaces()两个方法,用于返回带参数化类型的超类与接口。

2、

TypeVariable     类型变量  如 <T,K>中的T与K,由GenericDeclaration接口方法getTypeParameters()得到TypeVariable[]
ParameterizedType  参数化类型即泛型  如 List<String>   其中 List 为 (type)RawType, String 为 (type[])ActualTypeArguments
WildcardType     通配符表达式类型   如 ? extends T
GenericArrayType  泛型数组
GenericDeclaration 接口,实现者可以声名类型变量进而形成泛型   

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android开发中,如果想将泛型作为字符串打印出来,可以使用Java中的反射机制来实现。以下是一种可能的实现方式。 1. 首先,定义一个泛型类或方法,例如: ```java public class GenericClass<T> { // ... // 定义一些泛型方法或成员变量 // ... } ``` 2. 在Android中,使用反射机制获取泛型的类型,并将其转换为字符串。可以使用如下代码: ```java GenericClass<Integer> genericClass = new GenericClass<>(); Type genericType = genericClass.getClass().getGenericSuperclass(); if (genericType instanceof ParameterizedType) { ParameterizedType parameterizedType = (ParameterizedType) genericType; Type[] actualTypeArguments = parameterizedType.getActualTypeArguments(); for (Type type : actualTypeArguments) { String typeName = type.toString(); Log.d(TAG, "泛型类型:" + typeName); } } ``` 上述代码中,首先创建一个泛型对象`genericClass`,然后通过`getClass()`获取Class对象,接着使用`getGenericSuperclass()`获取泛型的类型`genericType`。 3. 判断泛型类型是否是参数化类型`ParameterizedType`,如果是,通过调用`getActualTypeArguments()`方法获取泛型参数类型,并将其转换为字符串,最后通过`Log.d()`或其他方式打印出来。 需要注意的是,以上代码仅适用于泛型类,如果要适用于泛型方法,可以使用`Method`类中的`getGenericReturnType()`等方法获取相关信息。 总结:通过以上步骤,我们可以将Android中的泛型作为字符串打印出来,并在开发过程中对其进行调试和分析

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值