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.
  • @since 1.5
    /
    public interface Type {
    /
    *
    • Returns a string describing this type, including information
    • about any type parameters.
    • @implSpec The default implementation calls {@code toString}.
    • @return a string describing this type
    • @since 1.8
      */
      default String getTypeName() {
      return toString();
      }
      }
      上面是在JDK1.8中Type类的源代码。

Type是Java语言中所有类型的父接口,包括
raw types(原始类型,包括类,枚举,接口,注解,数组(但不包括泛型数组)),
parameterized types(参数化类型,如Set,Map<String,String>,Class<?>),
array types(泛型数组和参数类型数组,如T[],List[]),
type variables(类型变量,如T,K,V) and
primitive types(基本类型,如boolean,char,byte,short,int,long,float,double).

继承图

image.png
每种类型都有对应的类或者接口

raw types 对应 Class

parameterized types 对应 ParameterizedType

array types 对应 GenericArrayType

type variables 对应 TypeVariable

primitive types 对应 Class

还有一种是通配符?
? 对应 WildcardType

下面看一下简单的例子吧

声明一个枚举类

package com.type;

public enum EnumTest {
}
声明一个接口类

package com.type;

public interface InterfaceTest {
}
声明一个注解类

package com.type;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface AnnotationTest {
}
package com.type;

import java.util.List;
import java.util.Map;

public class TypeBean {
private T t;
private String string;
private Map<String,String> map;
private List list;
private int aint;
private T[] tArray;
private int[] intAarry;
private Integer[] integers;
private List[] lists;
private Class<?> clazz;
private EnumTest enumTest;
private InterfaceTest interfaceTest;
private AnnotationTest annotationTest;
}
测试类

package com.type;

import java.lang.reflect.*;

public class TypeBeanTest {
public static void main(String[] args) {
Field[] declaredFields = TypeBean.class.getDeclaredFields();
for (int i = 0; i < declaredFields.length; i++) {
Field declaredField = declaredFields[i];
Type genericType = declaredField.getGenericType();
System.out.println("变量名:" + declaredField.getName());
System.out.println("变量声明的类型:"+genericType.getTypeName());
if (genericType instanceof Class) {
System.out.println("变量类型为Class");
} else if (genericType instanceof ParameterizedType) {
System.out.println("变量类型为ParameterizedType");
} else if (genericType instanceof TypeVariable) {
System.out.println("变量类型为TypeVariable");
} else if (genericType instanceof GenericArrayType) {
System.out.println("变量类型为GenericArrayType");
} else if (genericType instanceof WildcardType) {
System.out.println("变量类型为WildcardType");
}
System.out.println();
}
}
}
测试结果

变量名:t
变量声明的类型:T
变量类型为TypeVariable

变量名:string
变量声明的类型:java.lang.String
变量类型为Class

变量名:map
变量声明的类型:java.util.Map<java.lang.String, java.lang.String>
变量类型为ParameterizedType

变量名:list
变量声明的类型:java.util.List
变量类型为ParameterizedType

变量名:aint
变量声明的类型:int
变量类型为Class

变量名:tArray
变量声明的类型:T[]
变量类型为GenericArrayType

变量名:intAarry
变量声明的类型:int[]
变量类型为Class

变量名:integers
变量声明的类型:java.lang.Integer[]
变量类型为Class

变量名:lists
变量声明的类型:java.util.List<java.lang.String>[]
变量类型为GenericArrayType

变量名:clazz
变量声明的类型:java.lang.Class<?>
变量类型为ParameterizedType

变量名:enumTest
变量声明的类型:com.type.EnumTest
变量类型为Class

变量名:interfaceTest
变量声明的类型:com.type.InterfaceTest
变量类型为Class

变量名:annotationTest
变量声明的类型:com.type.AnnotationTest
变量类型为Class
4人点赞
Java

作者:曾泽浩
链接:https://www.jianshu.com/p/73ca5ee59258
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

posted @ 2020-05-01 00:37  CyberPelican  阅读(656)  评论(0编辑  收藏  举报