优质文章,及时送达

作者 | 的一幕

来源 | www.jianshu.com/p/dd34211f2565

这一节主要讲的内容是java中泛型的应用,通过该篇让大家更好地理解泛型,以及面试中经常说的泛型类型擦除是什么概念,今天就带着这几个问题一起看下:

举一个简单的例子:

这里可以看出来在代码编写阶段就已经报错了,不能往string类型的集合中添加int类型的数据。

那可不可以往List集合中添加多个类型的数据呢,答案是可以的,其实我们可以把list集合当成普通的类也是没问题的,那么就有下面的代码:

从这里可以看出来,不定义泛型也是可以往集合中添加数据的,所以说 泛型只是一种类型的规范,在代码编写阶段起一种限制。

下面我们通过例子来介绍泛型背后数据是什么类型

public class BaseBean {
T value;
public T getValue {
return value;
}
public void setValue(T value) {
this.value = value;
}
}

上面定义了一个泛型的类,然后我们通过反射获取属性和getValue方法返回的数据类型:

从日志上看到通过反射获取到的属性是Object类型的,在方法中返回的是string类型,因此咋们可以思考在getValue方法里面实际是做了个强转的动作,将object类型的value强转成string类型。是的,没错,因为泛型只是为了约束我们规范代码,而对于编译完之后的class交给虚拟机后,对于虚拟机它是没有泛型的说法的,所有的泛型在它看来都是object类型,因此泛型擦除是对于虚拟机而言的。

下面我们再来看一种泛型结构:

这里我将泛型加了个关键字extends,对于泛型写得多的伙伴们来说,extends是约束了泛型是向下继承的,最后我们通过反射获取value的类型是String类型的,因此这里也不难看出,加extends关键字其实最终目的是约束泛型是属于哪一类的。所以我们在编写代码的时候如果没有向下兼容类型,会警告错误的:

大家有没有想过为啥要用泛型呢,既然说了泛型其实对于jvm来说都是Object类型的,那咱们直接将类型定义成Object不就是的了,这种做法是可以,但是在拿到Object类型值之后,自己还得强转,因此泛型减少了代码的强转工作,而将这些工作交给了虚拟机。

比如下面我们没有定义泛型的例子:

势必在getValue的时候代码有个强转的过程,因此在能用泛型的时候,尽量用泛型来写,而且我认为一个好的架构师,业务的抽取是离不开泛型的定义。

常见的泛型主要有作用在普通类上面,

作用在抽象类、接口、静态或非静态方法上。

类上面的泛型

比如实际项目中,我们经常会遇到服务端返回的接口中都有errMsgstatus

等公共返回信息,而变动的数据结构是data信息,因此我们可以抽取公共的

BaseBean

public class BaseBean {
public String errMsg;
public T data;
public int status;
}

抽象类或接口上的泛型

//抽象类泛型
public abstract class BaseAdapter {
List DATAS;
}
//接口泛型
public interface Factory {
T create;
}

//方法泛型
public static T getData {
return ;
}

多元泛型

public interface Base {
void setKey(K k);
V getValue;
}

泛型二级抽象类或接口

public interface BaseCommon extends Base {}//或抽象类public abstract class BaseCommon implements Base {}

抽象里面包含抽象

public interface Base {
// void setKey(K k);
//
// V getValue;
void addNode(Map map);
Map getNode(int index);
}
public abstract class BaseCommon implements Base {
//多重泛型
LinkedList> DATAS = new LinkedList<>;
@Override
public void addNode(Map map) {
DATAS.addLast(map);
}
@Override
public Map getNode(int index) {
return DATAS.get(index);
}
}

>通配符

>通配符和区别是>在你不知道泛型类型的时候,可以用>通配符来定义,下面通过一个例子来看看>的用处:

//定义了一个普通类
public class BaseBean {
T value;
public T getValue {
return value;
}
public void setValue(T value) {
this.value = value;
}
}
//用来定义泛型的
public class Common1 extends Common {
}

在定义的时候将Common的泛型指向Common1的泛型,可以看到直接提示有问题,这里可以想,虽然Common1是继承自Common的,但是并不代表BaseBean之间是等量的,在开篇也讲过,如果泛型传入的是什么类型,那么在BaseBean中的getValue返回的类型就是什么,因此可以想两个不同的泛型类肯定是不等价的,但是如果我这里写呢:

public static void main(String[] args) {BaseBean commonBaseBean = new BaseBean<>;//通配符定义就没有问题BaseBean> common1BaseBean = commonBaseBean;try {//通过反射猜测setValue的参数是Object类型的Method setValue = common1BaseBean.getClass.getDeclaredMethod("setValue

泛型类有什么作用_3 分钟带你彻底搞懂 Java 泛型背后的秘密相关推荐

  1. 10分钟带你彻底搞懂负载均衡

    文章目录 十分钟搞懂系列 负载均衡是如何保证软件系统的生产部署的? 负载均衡分发策略 请求由谁来分发? 服务器端负载均衡器 客户端负载均衡 请求分发到哪去? 静态负载均衡算法 动态负载均衡算法 十分钟 ...

  2. 8分钟带你深入浅出搞懂Nginx

    8分钟带你深入浅出搞懂Nginx Nginx是一款轻量级的Web服务器.反向代理服务器,由于它的内存占用少,启动极快,高并发能力强,在互联网项目中广泛应用. 架构图 上图基本上说明了当下流行的技术架构 ...

  3. 10分钟带你彻底搞懂微内核架构

    文章目录 十分钟搞懂系列 什么是微内核架构? 如何实现微内核架构? 总结 十分钟搞懂系列 序号 标题 链接 1 10分钟带你彻底搞懂企业服务总线 https://blog.csdn.net/belon ...

  4. 10分钟带你彻底搞懂服务限流和服务降级

    文章目录 十分钟搞懂系列 服务限流 计数器法 滑动窗口法 漏桶算法 令牌桶算法 服务降级 十分钟搞懂系列 序号 标题 链接 1 10分钟带你彻底搞懂企业服务总线 https://blog.csdn.n ...

  5. 原码一位乘法器设计_十分钟带你彻底搞懂原码、反码、补码

    点击上方"程序员大白",选择"星标"公众号 重磅干货,第一时间送达 编辑 | 程序员大白公众号来源丨https://www.cnblogs.com/zhangz ...

  6. 【CSS】5分钟带你彻底搞懂 W3C IE 盒模型

    前言 大家好,我是HoMeTown,CSS是作为前端必有技术栈之一,但是有很多同学其实对CSS的盒模型都不是很了解,今天想聊一下Css盒子模型. 盒模型是什么 首先当一个Document对进行布局(l ...

  7. 信不信十分钟让你彻底搞懂java反射

    有反射就有正射 直接new对象就叫正射 如下 Map<String, String> map = new HashMap<>(); map.put("蔡徐鸡" ...

  8. 怎么用Python写出随时间变化的字_面试必备 | 带你彻底搞懂 Python 生成器

    文章转载地址:面试必备 | 带你彻底搞懂 Python 生成器. 写在之前 Python 的高级语言特性一直是我们学习 Python 的一个难点,大部分人并没有做到熟练的掌握,甚至去学习它都感觉很困难 ...

  9. 一文带你彻底搞懂i++和++i的区别,谁的效率更高?

    作者简介:Codebowl靓仔,学妹的工具人,C++开发误入数据开发,梦想30岁退休的靓仔就是我啦. i++和++i对于初学者来说,一直是一个特别容易搞混的内容,相信很多人现在也没有完全搞清(作者初学 ...

最新文章

  1. 配置IIS的负载均衡
  2. 投资计算机方面的策略构建,金融投资简单的策略分享和构建策略的基本思路
  3. LRGB一个带亮度值的颜色
  4. java反射对实体类取值和赋值,可以写成通过实体类获取其他元素的数据,很方便哦~~~...
  5. 领导问“BUG解决了没有”,吾一听就知道完蛋了
  6. paip.JAVA的几大优点与缺点相比C#.NET.txt
  7. 玩游戏显示计算机内存不足怎么办,电脑魔兽世界内存不足怎么办
  8. 《上帝给我一个任务,叫我牵一只蜗牛去散步》
  9. 瞎琢磨先生のJava工具类
  10. java怎么定位error_程序遇到错误定位一些小技巧
  11. c语言总分和平均分,用C语言编程平均分数
  12. 01-Weakly supervised consistency
  13. 搞不定Excel没关系,这款神器让你秒变数据可视化高手
  14. 计算机丢失系统文件如何找回,电脑系统文件丢失怎么办
  15. 职场工作细节提升建议
  16. 图像增广 || 通过仿射变换实现图像的平移、缩放、旋转、翻转、错切,及MATLAB实现与分析
  17. 关于QTableWidget中单元格的合并
  18. Android动画分类
  19. 【其他】3dmax撤销Ctrl+z不能用的解决办法
  20. 设置源码解析--Uim/Sim卡锁定

热门文章

  1. jquery UI集合
  2. as的使用技巧及注意点
  3. android 手动回收对象,Android Studio Studio回收列表中的JSON对象
  4. php中newself(),在php代码中新建对象用到的new self与new static有什么不同
  5. python安装环境傻瓜式安装_前后端分离——前端开发环境傻瓜式一步到位 nodejs ruby python nginx 安装搭建配置...
  6. excel导入linux乱码怎么解决方法,,请大家都来看下,Excel导入有乱码?原因出在哪里?应该怎么解决?...
  7. ios微信本地视频上传到服务器,ios本地视频wx.uploadFile上传
  8. kernel启动过程总结的思维导图
  9. [Swift实际操作]八、实用进阶-(7)使用通知的方法进行对象间的消息传递
  10. Unity3D_(游戏)控制物体的上、下、左、右移动