Java源码解析之TypeVariable详解

 更新时间:2017年10月26日 10:40:03   作者:青楼有罪  
这篇文章主要介绍了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>中的D是extends GenericDeclaration的,用来通过范型变量反向获取拥有这个变量的GenericDeclaration。

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

  类型变量的声明(定义):<E>,前后需加上尖括号

//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){}

【注意】类型变量声明(定义)的时候不能有下限(既不能有super),否则编译报错。为什么?T extends classA表示泛型有上限classA,当然可以,因为这样,每一个传进来的类型必定是classA(具有classA的一切属性和方法),但若是T super classA,传进来的类型不一定具有classA的属性和方法,当然就不适用于泛型,说的具体点:

//假设
class A<T super classA>{
  T t;
  public void test(){
    //这个时候你不能用t干任何事,因为你不确定t具有哪些属性和方法
    //当然,t肯定是有Object方法的,但没意义
  }
}

源码详解

1.getBounds

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

class A<K extends classA & interfaceB, V>{
  K key;
  V value;
  public static void main(String[] args) throws Exception
  {
    Type[] types = Main.class.getTypeParameters();
    for(Type type : types){
      TypeVariable t = (TypeVariable)type;
      System.out.println(t.getGenericDeclaration());
      int size = t.getBounds().length;
      System.out.println(t.getBounds()[size - 1]);
      System.out.println(t.getName() + "\n-------------分割线-------------");
    }
  }
}
//输出结果
class com.fcc.test.Main
interface com.fcc.test.interfaceB
K
-------------分割线-------------
class com.fcc.test.Main
class java.lang.Object
V
-------------分割线-------------

2.getGenericDeclaration

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

class com.xxx.xxx.classA 或
public void com.fcc.test.Main.test(java.util.List) 或
public com.fcc.test.Main()

Constructor constructor = Main.class.getConstructor();
TypeVariable typeVariable = constructor.getTypeParameters()[0];
System.out.println(typeVariable.getGenericDeclaration());
//获得方法中声明(定义)的类型变量与上面类似

3.getName

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

总结

以上就是本文关于Java源码解析之TypeVariable详解的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站:Java源码解析之object类java.lang.Void类源码解析等,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

相关文章

  • java类的加载过程以及类加载器的分析

    java类的加载过程以及类加载器的分析

    这篇文章给大家详细讲述了java类的加载过程以及类加载器的相关知识点内容,有需要的朋友可以学习下。
    2018-08-08
  • java 题解LeetCode38外观数列示例

    java 题解LeetCode38外观数列示例

    这篇文章主要为大家介绍了java 题解LeetCode38外观数列示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • springboot 中 druid+jpa+MYSQL数据库配置过程

    springboot 中 druid+jpa+MYSQL数据库配置过程

    这篇文章主要介绍了springboot 中 druid+jpa+MYSQL数据库配置,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-08-08
  • java 重定义数组的实现方法(与VB的ReDim相像)

    java 重定义数组的实现方法(与VB的ReDim相像)

    java 重定义数组的实现方法(与VB的ReDim相像),需要的朋友可以参考一下
    2013-04-04
  • 解读JSONArray删除元素的两种方式

    解读JSONArray删除元素的两种方式

    这篇文章主要介绍了解读JSONArray删除元素的两种方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12
  • java 虚拟机深入了解

    java 虚拟机深入了解

    这篇文章主要介绍了java 虚拟机深入了解的相关资料,ava虚拟机有自己完善的硬体架构,如处理器、堆栈、寄存器等,还具有相应的指令系统,需要的朋友可以参考下
    2017-03-03
  • spring与mybatis整合配置文件

    spring与mybatis整合配置文件

    本文通过实例代码给大家介绍了spring与mybatis整合配置文件的方法,需要的朋友参考下吧
    2017-09-09
  • Java中Future和FutureTask的示例详解及使用

    Java中Future和FutureTask的示例详解及使用

    Java中的Future和FutureTask通常和线程池搭配使用,用来获取线程池返回执行后的返回值,下面这篇文章主要给大家介绍了关于Java中Future和FutureTask使用的相关资料,需要的朋友可以参考下
    2021-11-11
  • SpringMVC的ModelAndView传值方法

    SpringMVC的ModelAndView传值方法

    今天小编就为大家分享一篇SpringMVC的ModelAndView传值方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-08-08
  • SpringBoot整合MyBatis Plus实现基本CRUD与高级功能

    SpringBoot整合MyBatis Plus实现基本CRUD与高级功能

    Spring Boot是一款用于快速构建Spring应用程序的框架,而MyBatis Plus是MyBatis的增强工具,本文将详细介绍如何在Spring Boot项目中整合MyBatis Plus,并展示其基本CRUD功能以及高级功能的实现方式,需要的朋友可以参考下
    2024-02-02

最新评论