idea怎么做网站,郑州电商小程序定制,wordpress模板导出,上海尚海整装官方网站文章目录Type简介Type分类1. 原始类型(Class)2. 参数化类型(ParameterizedType)3. 类型变量(TypeVariable)4. 通配符类型(WildcardType)5. 泛型数组类型(GenericArrayType)Type简介
Type是Java编程语言中所有类型的公共高级接口。它们包括原始类型、参数化类型、数组类型、类型…
文章目录Type简介Type分类1. 原始类型(Class)2. 参数化类型(ParameterizedType)3. 类型变量(TypeVariable)4. 通配符类型(WildcardType)5. 泛型数组类型(GenericArrayType)Type简介
Type是Java编程语言中所有类型的公共高级接口。它们包括原始类型、参数化类型、数组类型、类型变量和基本类型。
Type接口本身算是一个标记接口不提供任何需要复写的方法。
Type分类 Type分类
Type分类名称Type类型描述举例原始类型ClassJava类、枚举、数组、注解、所有基本数据类型String、Date、Integer、int、boolean 等参数化类型ParameterizedType参数化类型泛型类型ListString、MapInteger,String、ListT、List?、List? extends Number、List? super Number 等类型变量TypeVariable泛型符号不包括通配符T、K、V、E 等通配符类型WildcardType通配符?、? extends Number、? super Number 等泛型数组类型GenericArrayType泛型数组List?[]、ListT[]、ListString[]、List? extends Number[]、T[] 等
获取Type
JDK的Class、Field、Method类提供了一些列的获取类型的相关方法。
可参考文章Java中如何获取泛型类型信息
1. 原始类型(Class)
原始类型的Type实现类为Class。这个类型与泛型无关其它4个类型都和泛型相关。
原始类型主要包括Java类、枚举、数组、注解、所有基本数据类型。
示例
public class TypeTest {private String string;private Integer integer;private long lon;private int[] intArr;public static void main(String[] args) throws Exception {System.out.println(TypeTest.class.getDeclaredField(string).getGenericType() instanceof Class ? String是原始类型 : String不是原始类型);System.out.println(TypeTest.class.getDeclaredField(integer).getGenericType() instanceof Class ? Integer是原始类型 : Integer不是原始类型);System.out.println(TypeTest.class.getDeclaredField(lon).getGenericType() instanceof Class ? long是原始类型 : long不是原始类型);System.out.println(TypeTest.class.getDeclaredField(intArr).getGenericType() instanceof Class ? int[]是原始类型 : int[]不是原始类型);}
}输出
String是原始类型
Integer是原始类型
long是原始类型
int[]是原始类型2. 参数化类型(ParameterizedType)
参数化类型的Type实现类为ParameterizedType。
参数化类型也就是泛型类型。
源码
public interface ParameterizedType extends Type {Type[] getActualTypeArguments();Type getRawType();Type getOwnerType();
}方法
getActualTypeArguments获取实际类型参数的Type集合getRawType获取声明此类型的类或接口的TypegetOwnerType如果声明此类型的类或接口为内部类这返回的是该内部类的外部类的Type也就是该内部类的拥有者
示例
public class TypeTestT {private MapInteger,String map;private ListString list1;private ListT list2;private List? list3;private List? extends Number list4;public static void main(String[] args) throws Exception {System.out.println(TypeTest.class.getDeclaredField(map).getGenericType() instanceof ParameterizedType ? MapInteger,String是参数化类型 : MapInteger,String不是参数化类型);System.out.println(TypeTest.class.getDeclaredField(list1).getGenericType() instanceof ParameterizedType ? ListString是参数化类型 : ListString不是参数化类型);System.out.println(TypeTest.class.getDeclaredField(list2).getGenericType() instanceof ParameterizedType ? ListT是参数化类型 : ListT不是参数化类型);System.out.println(TypeTest.class.getDeclaredField(list3).getGenericType() instanceof ParameterizedType ? List?是参数化类型 : List?不是参数化类型);System.out.println(TypeTest.class.getDeclaredField(list4).getGenericType() instanceof ParameterizedType ? List? extends Number是参数化类型 : List? extends Number不是参数化类型);System.out.println(-----------------------------------------------------------);ParameterizedType parameterizedType (ParameterizedType) TypeTest.class.getDeclaredField(map).getGenericType();for (Type actualTypeArgument : parameterizedType.getActualTypeArguments()) {System.out.println(getActualTypeArguments 方法返回值有 actualTypeArgument.getTypeName());}System.out.println(getRawType 方法返回值 parameterizedType.getRawType().getTypeName());System.out.println(getOwnerType 方法返回值 (parameterizedType.getOwnerType() ! null ? parameterizedType.getOwnerType().getTypeName() : null));}
}输出
MapInteger,String是参数化类型
ListString是参数化类型
ListT是参数化类型
List?是参数化类型
List? extends Number是参数化类型
-----------------------------------------------------------
getActualTypeArguments 方法返回值有java.lang.Integer
getActualTypeArguments 方法返回值有java.lang.String
getRawType 方法返回值java.util.Map
getOwnerType 方法返回值null3. 类型变量(TypeVariable)
类型变量的Type实现类为TypeVariable。
类型变量急速指的泛型符号不包括通配符。 源码
public interface TypeVariableD extends GenericDeclaration extends Type, AnnotatedElement {Type[] getBounds();D getGenericDeclaration();String getName();AnnotatedType[] getAnnotatedBounds();
}方法
getBounds类型变量对应的上边界。如果没有指定上限返回Object可以有多个getGenericDeclaration获取类型变量所在类的Type。getName获取类型变量在源码中定义的名称getAnnotatedBounds获取注解类型的上限数组
示例
public class TypeTestT {private ListT list2;private List? list3;private List? extends Number list4;public static void main(String[] args) throws Exception {System.out.println(((ParameterizedType)TypeTest.class.getDeclaredField(list2).getGenericType()).getActualTypeArguments()[0] instanceof TypeVariable ? T是类型变量 : T不是类型变量);System.out.println(((ParameterizedType)TypeTest.class.getDeclaredField(list3).getGenericType()).getActualTypeArguments()[0] instanceof TypeVariable ? ?是类型变量 : ?不是类型变量);System.out.println(((ParameterizedType)TypeTest.class.getDeclaredField(list4).getGenericType()).getActualTypeArguments()[0] instanceof TypeVariable ? ? extends Number是类型变量 : ? extends Number不是类型变量);System.out.println(---------------------------------------------------------------);TypeVariable typeVariable (TypeVariable)((ParameterizedType) TypeTest.class.getDeclaredField(list2).getGenericType()).getActualTypeArguments()[0];for (Type bound : typeVariable.getBounds()) {System.out.println(getBounds 方法返回值有 bound.getTypeName());}System.out.println(getGenericDeclaration 方法返回值 typeVariable.getGenericDeclaration());System.out.println(getName 方法返回值 typeVariable.getName());for (AnnotatedType annotatedType : typeVariable.getAnnotatedBounds()) {System.out.println(getAnnotatedBounds 方法返回值有 annotatedType.getType().getTypeName());}}
}输出
T是类型变量
?不是类型变量
? extends Number不是类型变量
---------------------------------------------------------------
getBounds 方法返回值有java.lang.Object
getGenericDeclaration 方法返回值class com.joker.test.generic.TypeTest
getName 方法返回值T
getAnnotatedBounds 方法返回值有java.lang.Object4. 通配符类型(WildcardType)
通配符类型的Type实现类为WildcardType。
源码
public interface WildcardType extends Type {Type[] getUpperBounds();Type[] getLowerBounds();
}
方法
getUpperBounds泛型表达式的上边界表达式中使用extendsgetLowerBounds泛型表达式的下边界表达式中使用super
示例
public class TypeTestT {private ListT list2;private List? list3;private List? extends Number list4;private List? super Number list5;public static void main(String[] args) throws Exception {System.out.println(((ParameterizedType)TypeTest.class.getDeclaredField(list2).getGenericType()).getActualTypeArguments()[0] instanceof WildcardType ? T是通配符类型 : T不是通配符类型);System.out.println(((ParameterizedType)TypeTest.class.getDeclaredField(list3).getGenericType()).getActualTypeArguments()[0] instanceof WildcardType ? ?是通配符类型 : ?不是通配符类型);System.out.println(((ParameterizedType)TypeTest.class.getDeclaredField(list4).getGenericType()).getActualTypeArguments()[0] instanceof WildcardType ? ? extends Number是通配符类型 : ? extends Number不是通配符类型);System.out.println(((ParameterizedType)TypeTest.class.getDeclaredField(list5).getGenericType()).getActualTypeArguments()[0] instanceof WildcardType ? ? super Number是通配符类型 : ? super Number不是通配符类型);System.out.println(-----------------------------------------------);WildcardType wildcardType1 (WildcardType)((ParameterizedType) TypeTest.class.getDeclaredField(list4).getGenericType()).getActualTypeArguments()[0];System.out.println(List? extends Number 上边界wildcardType1.getUpperBounds()[0].getTypeName());WildcardType wildcardType2 (WildcardType)((ParameterizedType) TypeTest.class.getDeclaredField(list5).getGenericType()).getActualTypeArguments()[0];System.out.println(List? super Number 上边界wildcardType2.getUpperBounds()[0].getTypeName());System.out.println(List? super Number 下边界wildcardType2.getLowerBounds()[0].getTypeName());}
}输出
T不是通配符类型
?是通配符类型
? extends Number是通配符类型
? super Number是通配符类型
-----------------------------------------------
List? extends Number 上边界java.lang.Number
List? super Number 上边界java.lang.Object
List? super Number 下边界java.lang.Number5. 泛型数组类型(GenericArrayType)
泛型数组类型的Type实现类为GenericArrayType。
注意普通类型的数组不属于泛型数组类型如int[]、Long[]、String[]。
源码
public interface GenericArrayType extends Type {Type getGenericComponentType();
}方法
getGenericComponentType返回泛型数组中成员类型
示例
public class TypeTestT {private String[] list;private ListString[] list1;private ListT[] list2;private List?[] list3;private List? extends Number[] list4;private T[] list5;public static void main(String[] args) throws Exception {System.out.println(TypeTest.class.getDeclaredField(list).getGenericType() instanceof GenericArrayType ? String[]是泛型数组类型 : String[]不是泛型数组类型);System.out.println(TypeTest.class.getDeclaredField(list1).getGenericType() instanceof GenericArrayType ? ListString[]是泛型数组类型 : ListString[]不是泛型数组类型);System.out.println(TypeTest.class.getDeclaredField(list2).getGenericType() instanceof GenericArrayType ? ListT[]是泛型数组类型 : ListT[]不是泛型数组类型);System.out.println(TypeTest.class.getDeclaredField(list3).getGenericType() instanceof GenericArrayType ? List?[]是泛型数组类型 : List?[]不是泛型数组类型);System.out.println(TypeTest.class.getDeclaredField(list4).getGenericType() instanceof GenericArrayType ? List? extends Number[]是泛型数组类型 : List? extends Number[]不是泛型数组类型);System.out.println(TypeTest.class.getDeclaredField(list5).getGenericType() instanceof GenericArrayType ? T[]是泛型数组类型 : T[]不是泛型数组类型);System.out.println(------------------------------------------------------);System.out.println(ListString[] 数组成员类型((GenericArrayType) TypeTest.class.getDeclaredField(list1).getGenericType()).getGenericComponentType().getTypeName());System.out.println(ListT[] 数组成员类型((GenericArrayType) TypeTest.class.getDeclaredField(list2).getGenericType()).getGenericComponentType().getTypeName());System.out.println(List?[] 数组成员类型((GenericArrayType) TypeTest.class.getDeclaredField(list3).getGenericType()).getGenericComponentType().getTypeName());System.out.println(List? extends Number[] 数组成员类型((GenericArrayType) TypeTest.class.getDeclaredField(list4).getGenericType()).getGenericComponentType().getTypeName());System.out.println(T[] 数组成员类型((GenericArrayType) TypeTest.class.getDeclaredField(list5).getGenericType()).getGenericComponentType().getTypeName());}
}输出
String[]不是泛型数组类型
ListString[]是泛型数组类型
ListT[]是泛型数组类型
List?[]是泛型数组类型
List? extends Number[]是泛型数组类型
T[]是泛型数组类型
------------------------------------------------------
ListString[] 数组成员类型java.util.Listjava.lang.String
ListT[] 数组成员类型java.util.ListT
List?[] 数组成员类型java.util.List?
List? extends Number[] 数组成员类型java.util.List? extends java.lang.Number
T[] 数组成员类型T