【java】泛型与Object的区别,如何在实际场景中选择泛型以及Object

news/2024/11/17 7:19:47/

泛型与Object的区别,如何在实际场景中选择泛型以及Object

      • 简介
      • 什么是泛型
      • 泛型的作用
      • 泛型与Object类有什么区别
      • 实际场景中该如何选择泛型
        • 案例1、创建泛型类
        • 案例2、使用泛型定义工具类(解决缓存穿透)
        • 案例3、集合类使用不确定泛型"<?>"

简介

本文介绍泛型与Object的区别,如何在实际场景中选择泛型以及Object

什么是泛型

以下内容来自菜鸟教程:

Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。

泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。

假定我们有这样一个需求:写一个排序方法,能够对整型数组、字符串数组甚至其他任何类型的数组进行排序,该如何实现?

答案是可以使用 Java 泛型。
使用 Java 泛型的概念,我们可以写一个泛型方法来对一个对象数组排序。然后,调用该泛型方法来对整型数组、浮点数数组、字符串数组等进行排序。

java 中泛型标记符:

E - Element (在集合中使用,因为集合中存放的是元素)
T - Type(Java 类)
K - Key(键)
V - Value(值)
N - Number(数值类型)
? - 表示不确定的 java 类型

其实 A-Z都可以作为泛型标记符,上面只是一种约定,增强代码的可读性,方便团队间的合作开发

泛型的作用

  1. 将运行时出现的错误提前到了编译时

  2. 避免了类型强转的麻烦

泛型与Object类有什么区别

主要是使用的时机不同

  • 泛型:如果我确定要用哪个对象,并且使用到这个对象里面的属性,选择用泛型,因为泛型代表着更精确的对象,能够使用独有的方法。

  • Object类:Object是所有类的父类,特别笼统,且只能使用固定的属性。只要有Object的地方,基本都能用泛型替代。

实际场景中该如何选择泛型

案例1、创建泛型类

其实这个例子很常见,在java源码中就有不少案例,比如常见的一些集合类

在这里插入图片描述

因为java在让开发者使用的时候是不知道我们要传入的类型的,而使用Object的话就需要开发者自己强转,可能会发生类型转换异常

案例2、使用泛型定义工具类(解决缓存穿透)

同样的道理,我们如果想自定义工具类给别人使用就要使用泛型,因为我们不确定使用者要传入的类型是哪些。

/*** 缓存穿透* @param keyPrefix key的前缀* @param id    id* @param type  返回值类型* @param dbFallback    函数* @param time  时间* @param unit  单位* @return* @param <T>   类型的泛型* @param <ID>  id的泛型*/public <T,ID> T queryWithPassThrough(String keyPrefix, ID id , Class<T> type, Function<ID, T> dbFallback, Long time, TimeUnit unit){String key = keyPrefix + id;// 1.从redis查询商铺缓存(以string类型为例)String json = stringRedisTemplate.opsForValue().get(key);// 2.判断是否存在if(StrUtil.isNotBlank(json)){// 3.存在,直接返回return JSONUtil.toBean(json, type);}// 判断命中的是否是空值if (json != null){return null;}// 4.不存在,根据id查询数据库T t = dbFallback.apply(id);// 5.不存在,返回错误if (r == null){// 将空值写入redisstringRedisTemplate.opsForValue().set(key,"",CACHE_NULL_TTL,TimeUnit.MINUTES);return null;}// 6.存在,写入redisthis.set(key, t, time, unit);// 7.返回return t;}

案例3、集合类使用不确定泛型"<?>"

这里要使用不确定泛型来接收集合类

    public String export(ArrayList<?> arrayList, Class<?> excelVO, String sheetName) {String fileName = System.currentTimeMillis() + XLSX;EasyExcel.write(fileName, excelVO).sheet(sheetName).doWrite(arrayList);return fileName;}

http://www.ppmy.cn/news/956467.html

相关文章

OpenMP并行化傅里叶变换

设计思想 傅里叶变换&#xff0c;表示能将满足一定条件的某个函数表示成三角函数&#xff08;正弦和/或余弦函数&#xff09;或者它们的积分的线性组合。在不同的研究领域&#xff0c;傅里叶变换具有多种不同的变体形式&#xff0c;如连续傅里叶变换和离散傅里叶变换。 快速傅…

未来不会使用chatgpt的人会被淘汰,那么国内不用梯子如何使用chatgpt?

ChatGPT 可以在提高工作效率方面提供多方面的帮助。以下是其中的一些例子&#xff1a; 时间管理&#xff1a;通过使用 ChatGPT&#xff0c;你可以设置提醒事项&#xff0c;安排会议&#xff0c;以及进行其他与时间管理相关的任务。 研究和信息收集&#xff1a;ChatGPT 可以用来…

echarts 地图点击常见问题

echats 散点图不支持缩放 echarts 地图点击激活label如何去除 高德loca 1.4版本热力图报错 绘制的颜色区间是 0 --1 高德地图销毁不生效 自己傻逼&#xff0c;每次没有清空数组导致叠加数据&#xff0c;约点数据越多。 为何用高德地图district.search查询不到别的省数据&…

数据结构问答3

1. 栈、队列、线性表的区别与联系(异同) 答: 栈和队列联系:逻辑结构都是线性结构;存储结构都可以采用顺序存储结构和链式存储结构;他们的数据元素都呈线性关系,是一种的线性表,且只允许在端点处插入和删除元素 栈、队列和线性表联系:栈和队列都是一种操作受限的线性…

在使用腾讯云函数创建chatgpt反代理需要注意的事情

由于作者原来给的zip包里面有个app.js里面api地址是不对的 需要修改为https://api.openai.com/v1 这样我们重新部署函数就可以正常使用啦啦 然后还有注意的时&#xff0c;在创建的时候执行时间改为35秒&#xff0c;不要900秒&#xff0c;太长了。 创建完成之后&#xff0c;一定…

Http代理服务器—Netty版

基本思路 首先讲解一下基本的思路。下图展示的是代理服务器所处的位置&#xff1a; 从代理服务器的位置上看&#xff0c;其职能有3点 接收请求端的数据转发请求到目标服务器转发目标服务器的数据到请求端 所以我们使用Netty搭建代理服务器时&#xff0c;就需要满足上述三种…

代理服务器对比HA,NGINX

一、代理服务器优缺点&#xff1a;HAProxy、Nginx、LVS、Apache 比较 HAProxy Nginx LVS Apache 简介 高可用、负载均衡且基于TCP和HTTP应用的代理&#xff0c;支持高并发&#xff0c;多集群反代。 高性能http和反向代理服务器、邮件代理服务器&#xff0c;支持高并发…

Haproxy 代理后端服务

参考 http://www.haproxy.org HAProxy GitHub 目录 一、Haproxy环境准备 1、Haproxy简介 1.1、haproxy原理 1.2、Haproxy优点 2、在线apt安装 二、使用Haproxy 1、基本脚本结构示例 2、配置反向代理 3、验证haproxy 3.1、重启服务 3.2、访问后台管理 3.3、访问…