泛型类有什么作用_3 分钟带你彻底搞懂 Java 泛型背后的秘密
优质文章,及时送达
作者 | 的一幕
来源 | 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的时候代码有个强转的过程,因此在能用泛型的时候,尽量用泛型来写,而且我认为一个好的架构师,业务的抽取是离不开泛型的定义。
常见的泛型主要有作用在普通类上面,
作用在抽象类、接口、静态或非静态方法上。
类上面的泛型
比如实际项目中,我们经常会遇到服务端返回的接口中都有
errMsg
、status
等公共返回信息,而变动的数据结构是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 泛型背后的秘密相关推荐
- 10分钟带你彻底搞懂负载均衡
文章目录 十分钟搞懂系列 负载均衡是如何保证软件系统的生产部署的? 负载均衡分发策略 请求由谁来分发? 服务器端负载均衡器 客户端负载均衡 请求分发到哪去? 静态负载均衡算法 动态负载均衡算法 十分钟 ...
- 8分钟带你深入浅出搞懂Nginx
8分钟带你深入浅出搞懂Nginx Nginx是一款轻量级的Web服务器.反向代理服务器,由于它的内存占用少,启动极快,高并发能力强,在互联网项目中广泛应用. 架构图 上图基本上说明了当下流行的技术架构 ...
- 10分钟带你彻底搞懂微内核架构
文章目录 十分钟搞懂系列 什么是微内核架构? 如何实现微内核架构? 总结 十分钟搞懂系列 序号 标题 链接 1 10分钟带你彻底搞懂企业服务总线 https://blog.csdn.net/belon ...
- 10分钟带你彻底搞懂服务限流和服务降级
文章目录 十分钟搞懂系列 服务限流 计数器法 滑动窗口法 漏桶算法 令牌桶算法 服务降级 十分钟搞懂系列 序号 标题 链接 1 10分钟带你彻底搞懂企业服务总线 https://blog.csdn.n ...
- 原码一位乘法器设计_十分钟带你彻底搞懂原码、反码、补码
点击上方"程序员大白",选择"星标"公众号 重磅干货,第一时间送达 编辑 | 程序员大白公众号来源丨https://www.cnblogs.com/zhangz ...
- 【CSS】5分钟带你彻底搞懂 W3C IE 盒模型
前言 大家好,我是HoMeTown,CSS是作为前端必有技术栈之一,但是有很多同学其实对CSS的盒模型都不是很了解,今天想聊一下Css盒子模型. 盒模型是什么 首先当一个Document对进行布局(l ...
- 信不信十分钟让你彻底搞懂java反射
有反射就有正射 直接new对象就叫正射 如下 Map<String, String> map = new HashMap<>(); map.put("蔡徐鸡" ...
- 怎么用Python写出随时间变化的字_面试必备 | 带你彻底搞懂 Python 生成器
文章转载地址:面试必备 | 带你彻底搞懂 Python 生成器. 写在之前 Python 的高级语言特性一直是我们学习 Python 的一个难点,大部分人并没有做到熟练的掌握,甚至去学习它都感觉很困难 ...
- 一文带你彻底搞懂i++和++i的区别,谁的效率更高?
作者简介:Codebowl靓仔,学妹的工具人,C++开发误入数据开发,梦想30岁退休的靓仔就是我啦. i++和++i对于初学者来说,一直是一个特别容易搞混的内容,相信很多人现在也没有完全搞清(作者初学 ...
最新文章
- 配置IIS的负载均衡
- 投资计算机方面的策略构建,金融投资简单的策略分享和构建策略的基本思路
- LRGB一个带亮度值的颜色
- java反射对实体类取值和赋值,可以写成通过实体类获取其他元素的数据,很方便哦~~~...
- 领导问“BUG解决了没有”,吾一听就知道完蛋了
- paip.JAVA的几大优点与缺点相比C#.NET.txt
- 玩游戏显示计算机内存不足怎么办,电脑魔兽世界内存不足怎么办
- 《上帝给我一个任务,叫我牵一只蜗牛去散步》
- 瞎琢磨先生のJava工具类
- java怎么定位error_程序遇到错误定位一些小技巧
- c语言总分和平均分,用C语言编程平均分数
- 01-Weakly supervised consistency
- 搞不定Excel没关系,这款神器让你秒变数据可视化高手
- 计算机丢失系统文件如何找回,电脑系统文件丢失怎么办
- 职场工作细节提升建议
- 图像增广 || 通过仿射变换实现图像的平移、缩放、旋转、翻转、错切,及MATLAB实现与分析
- 关于QTableWidget中单元格的合并
- Android动画分类
- 【其他】3dmax撤销Ctrl+z不能用的解决办法
- 设置源码解析--Uim/Sim卡锁定
热门文章
- jquery UI集合
- as的使用技巧及注意点
- android 手动回收对象,Android Studio Studio回收列表中的JSON对象
- php中newself(),在php代码中新建对象用到的new self与new static有什么不同
- python安装环境傻瓜式安装_前后端分离——前端开发环境傻瓜式一步到位 nodejs ruby python nginx 安装搭建配置...
- excel导入linux乱码怎么解决方法,,请大家都来看下,Excel导入有乱码?原因出在哪里?应该怎么解决?...
- ios微信本地视频上传到服务器,ios本地视频wx.uploadFile上传
- kernel启动过程总结的思维导图
- [Swift实际操作]八、实用进阶-(7)使用通知的方法进行对象间的消息传递
- Unity3D_(游戏)控制物体的上、下、左、右移动