JAVA 反射之java.lang.reflect.Type

JAVA 反射之java.lang.reflect.Type

Scroll Down

Java中的Type

简介

泛型引入之前,Java中的类型系统很简单: 完全取决于Class,泛型引入后,变为以java.lang.reflect.Type为标识的,更加复杂的类型系统.本文将简述以Type为标识的类型系统的概念,构成和使用.

正文

回顾以Class为标识的类型系统

Instances of the class Class represent classes and interfaces in a running Java application. An enum type is a kind of class and an annotation type is a kind of interface. Every array also belongs to a class that is reflected as a Class object that is shared by all arrays with the same element type and number of dimensions. The primitive Java types (boolean, byte, char, short, int, long, float, and double), and the keyword void are also represented as Class objects.

Class表示在一个运行的Java应用中的类或接口. 枚举是一种特殊形式的类,注解是一种特殊类型的接口,数组属于也属于类(不好翻译,见谅),基础数据类型和Void也被表示为Class.

上面是摘抄Class的部分JavaDoc,看起来天大地大,Class最大, 由于所有对象都会对应某一个Class,因此在泛型出现之前,Class是具有类型标识的作用, 比如 new String("a"),new String("b")属于同一个Class String.class,new String("a")new Integer(1)则属于不同的Class.

Type体系

Type is the common superinterface for all types in the Java programming language. These include raw types, parameterized types, array types, type variables and primitive types.

Type 是Java编程语言中所有类型的父接口,这包含 原始类型(raw types),参数化类型(parameterized types),数组类型(array types),类型变量(type variables),原始类型(primitive types).

Type 是Java编程语言中所有类型的父接口,再来看下Java编程语言的类型构成图,Class变为它的子类,其地位可见一斑.(再此感叹下Class,真是个大"类")

javaType_1603933238964

在Type体系下,Java编程语言共有四种"类型": 原始类型,参数化类型,类型变量,泛型数组类型

  • Class: 之前的含义相同,代表原始类型
  • ParameterizedType参数化类型: 比如List<Integer>,List<Double>,List<T>在这里参数化指的就是 IntegerDouble,T.
  • TypeVariable 类型变量比如参数化类型中的T,表示泛指任何类
  • GenericArrayType 泛型数组类型: 比如List[],T[]这种。表示一种元素类型参数化类型或者类型变量数组类型
  • WildCardType通配符类型表示通配符表达式,它是Type的一个子接口,但是不作为Java中的类型,表示 ? extend Number, ? super Number,? 这种

举例:

方法签名
  public <T extends Number, R> R testType(List<Integer> a, List<List<Integer>> b, List<ArrayList<Integer>> c, List<T> d, List<? extends Number> e, List<? super Integer> f, List<List<Integer>[]> g, List<ArrayList<Integer>[]> h, Map<Integer, String> i ,T j ,List<?> k))
类型变量: -------------------------------------------
T 实现类:TypeVariableImpl
R 实现类:TypeVariableImpl
泛型参数(按照参数顺序):-----------------------------------
java.util.List<java.lang.Integer>    实现类:ParameterizedTypeImpl
   内部  actualType: class java.lang.Integer 实现类: Class
java.util.List<java.util.List<java.lang.Integer>>    实现类:ParameterizedTypeImpl
   内部  actualType: java.util.List<java.lang.Integer> 实现类: ParameterizedTypeImpl
java.util.List<java.util.ArrayList<java.lang.Integer>>   实现类:ParameterizedTypeImpl
   内部  actualType: java.util.ArrayList<java.lang.Integer> 实现类: ParameterizedTypeImpl
java.util.List<T>    实现类:ParameterizedTypeImpl
   内部  actualType: T 实现类: TypeVariableImpl
java.util.List<? extends java.lang.Number>   实现类:ParameterizedTypeImpl
   内部  actualType: ? extends java.lang.Number 实现类: WildcardTypeImpl
java.util.List<? super java.lang.Integer>    实现类:ParameterizedTypeImpl
   内部  actualType: ? super java.lang.Integer 实现类: WildcardTypeImpl
java.util.List<java.util.List<java.lang.Integer>[]>  实现类:ParameterizedTypeImpl
   内部  actualType: java.util.List<java.lang.Integer>[] 实现类: GenericArrayTypeImpl
java.util.List<java.util.ArrayList<java.lang.Integer>[]>     实现类:ParameterizedTypeImpl
   内部  actualType: java.util.ArrayList<java.lang.Integer>[] 实现类: GenericArrayTypeImpl
java.util.Map<java.lang.Integer, java.lang.String>   实现类:ParameterizedTypeImpl
   内部  actualType: class java.lang.Integer 实现类: Class actualType: class java.lang.String 实现类: Class
T    实现类:TypeVariableImpl
java.util.List<?>    实现类:ParameterizedTypeImpl
   内部  actualType: ? 实现类: WildcardTypeImpl

Type 子接口

  1. ParameterizedType 泛型/参数化类型【重要】
  2. TypeVariable 类型变量/泛指任何类【掌握】
  3. GenericArrayType (泛型)数组类型
  4. WildcardType 通配符(泛型)表达式

作者:alonwang
链接:https://www.jianshu.com/p/60d6a6cf7fd9
来源:简书