Java基础-我所理解的泛型


引用

【java】泛型中,? extends T 与 ? super T 的区别、看法_winrh的博客-CSDN博客_泛型 extends


前言

Java基础系列,我所整理的仅仅是自己平常没有用到的,或者是自己不太了解的内容。


Java的泛型其实仅仅是伪泛型,为什么这么说呢?其实Java的泛型其实仅仅是一种文字游戏,我所能思考到的唯一的好处就是他能够在编译阶段发现一些强转的问题,在后续的归纳中我会逐步给你进行归纳。

说真的,我还真的不知道Java的泛型还有这样的表示方法,看来Java比我想象中的要聪明一些,不过既然支持这样的操作,那么今后我能写的代码的复用性就能更高了,提前庆祝一下!
<T extends A & B & C & D>:只有A可能为类,因为Java只支持单继承模型。

List<? extends A>:List内存储的类型,你自己都不知道,你不可能往里面放任何类型的数据信息,甚至连A都不行,因为假如里面存储的类型为A的子类,那放A进去也会造成数据的丢失。但是从里面拿出来的东西,一定是A的子类,这点倒是没有问题。


疑问

Q::Java泛型的原理?什么是泛型擦除机制?
A:Java的泛型是JDK5新引入的特性,为了向下兼容,虚拟机其实是不支持泛型,所以Java实现的是一种伪泛型机制,也就是说Java在编译器擦出了所有的泛型信息,这样Java就不需要产生新的类型到字节码,所有的泛型类型最终都是一种原始类型,在Java运行时根本就不存在泛型信息。

Q:Java编译器具体是如何擦除泛型的?
A:
1. 检查类型变量,获取目标类型
2. 擦除类型变量,并替换为限定类型
如果泛型类型的类型变量没有限定(),则用Object作为原始类型
如果有限定,则用XClass 作为原始类型
如果有多个限定(T extends XClass1XClass1),则使用第一个边界XClass1作为原始类,因为单继承模型的原理,只有第一个才可能是类
3. 在必要时插入类型转化以保持类型安全
4. 生成桥方法以在扩展时保持多态性

Q:为什么没有泛型数组?
A:因为数组是协变,擦除后就没有办法满足数组协变的原则。同理,A extends B,Temp和Temp没有继承关系,也就是说两者之间是不可以进行强转的。
协变:一个类是另外一个类的子类,那么这个类的数组就是另外一个类的子类。

Java基础-我所理解的泛型相关推荐

  1. 《java基础》-胖菜鸟说泛型

    先扯两句   转眼之间距离上次发类.抽象类.接口已经过去了不知道多少个日夜了,原以为在博客中已经暗示的不能再明显了.可结果呢,几篇博客发出去了,别说找女朋友了,就连赞都没得到几个,在孤寂的夜自己的眼泪 ...

  2. java基础(十) 深入理解数组类型

    戳上面的蓝字关注我们哦! 精彩内容 精选java等全套视频教程 精选java电子图书 大数据视频教程精选 java项目练习精选 1. 数组类简介   在java中,数组也是一种引用类型,即是一种类. ...

  3. 夯实Java基础(十八)——泛型

    1.什么是泛型 泛型是Java1.5中出现的新特性,也是最重要的一个特性.泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数.这种参数类型可以用在类.接口和方法的创建中,分别称为泛型类. ...

  4. java基础知识(七)-- 泛型(Generics )

    介绍 用法: List list = new ArrayList();// 1 list .add(new Integer(12));// 2 Integer x = (Integer) list . ...

  5. java基础篇 - HashMap 理解Hash碰撞

    HashMap是大家都在用,面试的时候也经常会被考的考点,在这篇文章中说下HashMap的hash碰撞和减轻碰撞的优化. 1.什么是hash碰撞 在解释Hash碰撞之前先说一下hashmap的存储结构 ...

  6. Java基础—ClassLoader的理解

    ##默认的三个类加载器 Java默认是有三个ClassLoader,按层次关系从上到下依次是:- Bootstrap ClassLoader- Ext ClassLoader- System Clas ...

  7. java基础篇之理解synchronized的用法

    Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码. 一.当两个并发线程访问同一个对象object中的这个synchronized(this ...

  8. [Java基础]反射练习之越过泛型检查,运行配置文件制定内容

    代码如下: package ReflectTest01;import java.lang.reflect.InvocationTargetException; import java.lang.ref ...

  9. java基础(多态的理解与应用)

    1:多态概述 代码中的多态:父类引用指向子类对象.Animal ani = new Dog(); 狗是动物,这就是多态. 父类名称 变量名 = new 子类名称(); 接口名称 对象名 = new 实 ...

最新文章

  1. 原生javascript
  2. 22个激活函数,ReLU、RReLU、LeakyReLU、PReLU、Sofplus、ELU、CELU、SELU、GELU、ReLU6、Sigmoid、Tanh、Softsign、Hardtanh等
  3. peoplesoft系统与sap_sap顾问或者peoplesoft顾问转行做自研系统顾问的为什么那么少?...
  4. i 智慧 | 计算产业发展黄金10年 腾讯云弹性计算抢占计算蓝海
  5. B端产品如何做好从1到10的架构搭建?
  6. 产品经理需要向上思考
  7. 逆序创建链表及链表反转和中间位置反转
  8. JAMstack简介:现代Web的体系结构
  9. 第14章 定制字符画(《Python趣味创意编程》教学视频)
  10. android逆向工程反编译指南(详细教程)
  11. ipv6的127位掩码如何表示_IPv4地址、子网掩码、详细讲解
  12. 校友会2019中国大学计算机,校友会2019中国大学一流专业排名800强发布,北大清华复旦前三...
  13. matlab 图片字符切割,基于MATLAB的图片中字符的分割与识别
  14. 4个免费又好用的wordpress企业主题
  15. java生成不重复8位数字_生成8位随机不重复的数字编号
  16. springboot实现统一日志管理
  17. 倒排表数据结构、通配符查询、拼写纠正详解
  18. 一维数组cvs文件,求数据平均值
  19. Markdown 插入图片技巧
  20. R语言patchwork包将多个ggplot2可视化结果组合起来、使用plot_annotation函数为组合图添加标题信息、使用theme函数自定义组合图中的字体类型(family)

热门文章

  1. 被final修饰的变量在哪存储_final,static,this,super 关键字总结,一点课堂(多岸学院)...
  2. select查询中@作用_SQL学习第四关:复杂查询
  3. 快速创建包快捷键大全_99个CAD插件大全,各种工具箱和超实用辅助插件,绘图从此不卡顿...
  4. 有100名考生参加C语言测验,全国计算机一级考试模拟试题及答案(1-100)
  5. 如何短时间提高python面向对象_初识Python面向对象阶段,你们都是怎么过来的?
  6. linux下的ps aux | grep -c php-fpm 与netstat -napo |grep php-fpm | wc -l 命令
  7. 【机器学习入门到精通系列】插值与拟合
  8. python【力扣LeetCode算法题库】面试题 08.11- 硬币
  9. python【力扣LeetCode算法题库】15- 三数之和
  10. Tensorflow【实战Google深度学习框架】基于tensorflow + Vgg16进行图像分类识别