Java源码TypeVariable实例分析

  • 时间:
  • 3677人关注

这篇文章主要介绍了Java源码解析之TypeVariable详解,具有一定参考价值,需要的朋友可以了解下。,另外这篇文章主要知识点是关于java、typevariable、java、variable、Java源码的内容,如果大家想对相关知识点有系统深入的学习,可以参阅以下电子资料:

教程详情电子资料
  • 教程类别:Java源码
  • 编辑整理:习冠宇
  • 教程字数:2508字节
  • 阅读时间:大概8分钟
  • 下载本教程(DOC版)
  • Java编程的逻辑
  • Java Web从入门到精通(第3版)
  • Java虚拟机精讲
  • JavaScript从入门到精通
  • 软件开发综合实践指导教程:JAVA WEB应用
  • 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类源码解析等,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!


    上一篇:深入分析JDK1.6集合框架bug 6260652

    下一篇:解析Spring Boot实例通过接口安全退出

    相关内容

    • 如何用Java实现将容器 Map中的内容保存到数组

      这篇文章主要介绍了Java实现将容器 Map中的内容保存到数组,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

      05-03Java Map内容保存数组

      阅读更多
    • Java数据类型及类型转换的互相转换实例代码

      这篇文章主要介绍了Java 数据类型及类型转换的互相转换实例代码,需要的朋友可以参考下

      05-09java数据类型互相转换

      阅读更多
    • 如何让java程序运行

      04-29java程序运行

      阅读更多
    • java是如何输出的

      04-29java输出的方式

      阅读更多
    • java如何调用接口

      其实对于java调用接口进行获取对方服务器的数据在开发中特别常见,然而一些常用的基础的知识总是掌握不牢,让人容易忘记,写下来闲的时候看看,比回想总会好一些。 总体而言,一些东西知识点一直复制粘贴容易依赖,重要的是会忘记为什么这么写,只有理解到位,或者八九不离十才可以对于随时变化的情况进行分析,如果到家,还可以对别人或自己的进行优化。 如果你在这篇没有找到你想要的,请点击:java如何调用接口方式二 而对于一些知识

      04-27java调用接口的方法

      阅读更多
    • JavaScript数据可视化编程

      JavaScript数据可视化编程

      大小:61.8 MBjs编程

      点击下载
    • JavaScript+Vue+React全程实例

      JavaScript+Vue+React全程实例

      这书根据基础知识与开发实践活动紧密结合的观念,选萃当今简易、好用和时兴的百余个JavaScript编码案例,协助阅读者学习培训把握JavaScript开发语言。本书內容详实、重中之重突显、浅显易懂,包含了JavaScript前端开发开发的各个方面。

      大小:59150 MB MJS实例

      点击下载
    • 华为Java语言编程规范 安全篇 v2.0

      华为Java语言编程规范 安全篇 v2.0

      Java语言编程规范_下卷_安全篇 是针对Java语言编程中的输入校验、异常行为、IO操作、序列化和反序列化、平台安全与运行安全等方面,描述可能导致安全漏洞或风险的常见编码错误。 该规范基于业界最佳实践,参考业界安全编码规范相关著作,例如The Cert Secure Coding Standard for Java、Sun Secure Coding Guidelines for the Java Programming Language、CWE/SANS TOP 25和OWASP Guide Proj

      大小:294 KBJava编程

      点击下载

    学习笔记

    27小时59分钟前回答

    Java中的使用及连接Redis数据库(附源码)

    引言: 本文主要分享了Redis如何在IDEA中部署,运行;模拟加入Redis的操作; 目录结构 1. 在IDEA中搭建Redis 1.1 创建项目 新建含有web的SpringBoot项目; 搭建项目参考:SpringBoot超详细笔记:https://blog.csdn.net/weixin_42601136/article/details/108396511 1.2 添加依赖(不够手动添加) dependencies !-- 1、 Jedis-- dependency groupIdredis.clients/groupId artifactIdjedis/artifactId version2.9.0/version /dependency !-- 2、 Junit测试-- dependency groupIdjunit/groupId artifactIdjunit/artifactId version4.12/version /dependency dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-jdbc/artifactId /dependency dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-thymeleaf/artifactI……

    2小时34分钟前回答

    Java实现天天酷跑小游戏完整代码(附源码)

    首先,写一个需求文档: 一、项目名称:《天天酷跑》(RunDay) 二、功能介绍: 闯关类游戏,玩家登录后,选择进入游戏,通过键盘控制玩家的上下左右移动,来躲避 障碍物和吃金币,玩家躲避的障碍物越多跑酷距离越远,玩家吃的金币越多,得分越高。 三、功能模块: 1、登录界面 用户名(输入框,明文) 密码(输入框,密文) 登录、取消按钮 2、菜单选择界面 开始游戏按钮(图片按钮) 帮助按钮 退出按钮 3、缓冲加载界面 自动加载进度条,加载完毕之后,跳转到下一界面 4、游戏主界面 移动的背景图片、动态的玩家、五种障碍物持续出现、玩家和障碍物的碰撞、 暂停、继续功能、玩家的移……

    25小时30分钟前回答

    原生JavaScript实现精美的淘宝轮播图效果示例【附demo源码下载】

    本文实例讲述了原生JavaScript实现的淘宝轮播图效果。分享给大家供大家参考,具体如下: 轮播图是我们学习原生js的必经之路 它包含很多基本知识的运用,像this的使用,DOM的操作,还有setInterval的使用和清除,浮动与定位等等,很好的考察了我们的基础知识牢不牢固, 话不多说,直接上图 HTML代码 如下: !DOCTYPE htmlhtmlhead lang="en" meta charset="UTF-8" title淘宝轮播图/title link rel="stylesheet" href="css/initialize.css" rel="external nofollow" / link rel="stylesheet" href="css/tblunbotu.css" rel="external nofollow" //headbodydiv id="container" class="clearFix" div id="list" class="clearFix" img src="img/5.jpg" alt=""/ img src="img/1.jpg" alt=""/ img src="img/2.jpg" alt=""/ img src=……