jdk基础接口类

编程

Type:是java语言中所有类型的父类接口;

ParameterizedType:参数化类型接口;

rawType:返回承接参数的类或接口对象

getActualTypeArguments:返回参数化类型中的参数数组;

getOwnerType:返回当前类型所属的上级类型,如:O<T>.I<S>,则返回O<T>;当前已是顶级对象时,则返回null;

====

List<String>

rawType: List;

getActualTypeArguments:types[0] == String && types.length == 1;

getOwnerType:null

Map<String, Integer>

rawType: Map;

getActualTypeArguments:types[0] == String && types[1] == Integer && types.length == 2;

getOwnerType:null

GenericArrayType:泛型数组类型接口

这个类型容易迷惑;jdk介绍:

{@code GenericArrayType} represents an array type

whose component type is either a parameterized type or a type variable.

数组中的元素是参数化类型或者是变量类型;

即:int[]、Integer[]、String[]都是Class类型,而并非是GenericArrayType类型;

====

List<String>[] method1();

<T> T[] method2;

以上两种方法的返回值都属于GenericArrayType类型;

List<String>[]:

getGenericComponentType:List<String>属于ParameterizedType类型

<T> T[]:

getGenericComponentType:T属于TypeVariable类型

 TypeVariable:变量类型接口

public interface Level0Mapper<L, M, N> {}

L、M、N都属于变量

 GenericDeclaration:泛型定义接口

该接口在类图中有两处出现;

1.Class类的实现接口,如interface Level0Mapper<L, M, N>{}接口中

的L、M、N就是就是Level0Mapper.class所定义的泛型;

getTypeParameters():

TypeVariables.length day ==3 && TypeVariables[0] == L

&& TypeVariables[1] == M && TypeVariables[2] == N;

2.TypeVariable接口中的方法getGenericDeclaration,返回值是定义该泛型变量的类名,

这其实与Method.getDeclaringClass、Field.getDeclaringClass()含义类似,

都是返回定义该泛型、方法、属性的类名;

Class:应用运行中的所有类和接口的类实例

该类属于java开发者最熟知的类了,所有的对象进行装载后都是Class类的二进制文件;

Class有类似于GenericArrayType接口中的方法,如:getComponentType,

int[]、String[]属于Class类型,同时也是引用类型

int[]:

getComponentType:int.class

isArray:true

String[]:

getComponentType:String.class

isArray:true

List:

getComponentType:null

isArray:false

同时实现GenericDeclaration接口,可获取在该Class中定义的泛型元素

WIldcardType:通配符类型

List<? extends Integer & Comparator, ? super Age> method();

该方法返回值的类型是ParameterizedType类型

rawType:List

getActualTypeArguments:args[0]是WildcardType类型

getUpperBounds:bounds[0] == Integer 父类类型

getLowerBounds: bounds[0] == Age 子类类型

以上只是针对每个接口类型做了阐述,或许有很多描述不够准确,欢迎拍砖指正;

现在写一个比较简单的测试类,来体现部分类型接口的使用场景

public interface Level0Mapper<L, M, N> {

List<N> selectList(L param1, M param2);

}

public interface Level1Mapper<E, F> extends Level0Mapper<Date, Long, String> {

}

@Test

void test() {

Class<?> clazz = Level1Mapper.class;

Method method = clazz.getMethod("selectList", Object.class, Object.class);

ParameterizedType returnType = (ParameterizedType) method.getGenericReturnType();

assertEquals(List.class, returnType.getRawType());

String returnVar = ((TypeVariable) returnType.getActualTypeArguments()[0]).getName();

Type[] paramTypes = method.getGenericParameterTypes();

String paramVarOne = ((TypeVariable) paramTypes[0]).getName();

String paramVarTwo = ((TypeVariable) paramTypes[1]).getName();

ParameterizedType parentInter = (ParameterizedType) Level1Mapper.class.getGenericInterfaces()[0];

Type[] args = parentInter.getActualTypeArguments();

Class<?> superClass = (Class<?>) parentInter.getRawType();

TypeVariable[] vars = superClass.getTypeParameters();

Map<String, Type> paramMap = new HashMap<>();

for (int i=0; i< args.length; i++) {

paramMap.put(vars[i].getName(), args[i]);

}

assertEquals(String.class, paramMap.get(returnVar)); // 返回类型是String类型

assertEquals(Date.class, paramMap.get(paramVarOne)); // 第一个入参是Date类型

assertEquals(Long.class, paramMap.get(paramVarTwo)); // 第二个入参是Long类型

}

上面的例子比较容易理解,后续会将框架中的运用加以补充!!!

以上是 jdk基础接口类 的全部内容, 来源链接: utcz.com/z/514001.html

回到顶部