JAVA Type之TypeVariable 类型变量

JAVA Type之TypeVariable 类型变量

Scroll Down

Java类型之TypeVariable 类型变量

TypeVariable,类型变量,描述类型,表示泛指任意或相关一类类型,也可以说狭义上的泛型(泛指某一类类型),一般用大写字母作为变量,比如K、V、E等。

源码

public interface TypeVariable<D extends GenericDeclaration> extends Type {
   //获得泛型的上限,若未明确声明上边界则默认为Object
    Type[] getBounds();
    //获取声明该类型变量实体(即获得类、方法或构造器名)
    D getGenericDeclaration();
    //获得名称,即K、V、E之类名称
    String getName();
}

概述

说到TypeVariable<D>就不得不提起java泛型中另一个比较重要的接口对象,GenericDeclaration接口对象。该接口用来定义哪些对象上是可以声明(定义)范型变量,所谓范型变量就是<E extends List>或者<E>, 也就是TypeVariable<D>这个接口的对应的对象,TypeVariable<D>中的Dextends GenericDeclaration的,用来通过范型变量反向获取拥有这个变量的GenericDeclaration

目前实现GenericDeclaration接口的类包括Class, Method, Constructor,也就是说只能在这几种对象上进行范型变量的声明(定义)。GenericDeclaration的接口方法getTypeParameters用来逐个获取该GenericDeclaration的范型变量声明。

类型变量的声明(定义):

//1.在类(Class)上声明(定义)类型变量
class A<T>{
    T a;
}
//之后这里可用任意类型替换T,例如
A<String> as = new A<String>();

//是否看着有点像集合?不错,集合就是泛型的一个典型运用
//2.在方法上声明(定义)
public <E> void test(E e){}

//方法上,类型变量声明(定义)不是在参数里边,而且必须在返回值之前,static等修饰后
//3.声明(定义)在构造器上
public <K> A(K k){}

getBounds()

获得该类型变量的上限(上边界),若无显式定义(extends),默认为Object,类型变量的上限可能不止一个,因为可以用&符号限定多个(这其中有且只能有一个为类或抽象类,且必须放在extends后的第一个,即若有多个上边界,则第一个&后必为接口)。

public class TypeVariableTest<K extends classA & interfaceB, V> {
    K key;
    V value;

    public static void main(String[] args) {
        Type[] types = TypeVariableTest.class.getTypeParameters();
        for (Type type : types) {
            if (type instanceof TypeVariable) {
                TypeVariable t = (TypeVariable) type;
                System.out.print(t.getGenericDeclaration() + "  ");
                Type[] bounds = t.getBounds();
                System.out.print("[" + t.getName() + "]bounds:  ");
                for (Type bound : bounds) {
                    System.out.print(bound.getTypeName() + ",");
                }
                System.out.println();
                System.out.println();
            }
        }
    }
}

class classA {

}

interface interfaceB {

}

输出结果:

class com.hb0730.test.TypeVariableTest  [K]bounds:  com.hb0730.test.classA,com.hb0730.test.interfaceB,

class com.hb0730.test.TypeVariableTest  [V]bounds:  java.lang.Object,

getGenericDeclaration()

获得声明(定义)这个类型变量的类型及名称

public class TypeVariableTest<K extends classA & interfaceB, V> {
    K key;
    V value;

    public static void main(String[] args) {
        Type[] types = TypeVariableTest.class.getTypeParameters();
        for (Type type : types) {
            if (type instanceof TypeVariable) {
                System.out.println(((TypeVariable<?>) type).getGenericDeclaration());
            }
        }
    }
}

class classA {

}

interface interfaceB {

}

结果:

class com.hb0730.test.TypeVariableTest
class com.hb0730.test.TypeVariableTest

getName()

 获得这个类型变量在声明(定义)时候的名称

public class TypeVariableTest<K extends classA & interfaceB, V> {
    K key;
    V value;

    public static void main(String[] args) {
        Type[] types = TypeVariableTest.class.getTypeParameters();
        for (Type type : types) {
            if (type instanceof TypeVariable) {
                System.out.println(((TypeVariable<?>) type).getName());
            }
        }
    }
}

class classA {

}

interface interfaceB {

}

结果:

K
V

系列

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

作者:a327369238
链接:https://blog.csdn.net/a327369238
来源:csdn