当前位置: 首页 > news >正文

由点到面贯穿整个Java泛型理解

泛型概述

Java泛型(generics)是DK5中引入的一个新特性,泛型提供了编译时类型安全监测机制,该机制允许我们在编译时检测到非法的类型数据结构。

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

如我们经常使用的ArrayList中的使用E表示泛型的形参,需要我们传递指定实际的类型。

如果不指定默认是Object类型,Object不能强转为其本身的子类型,所以出现java.lang.Object无法转换为java.lang.String。

泛型类和接口

泛型类

1、泛型类的定义语法

2、常用的泛型标识:T、E、K、V

泛型标识可以作为成员变量的类型定义标识和函数的返回类型标识成员方法的参数类型标识

  class Test<T>{ //T创建对象的时候指定数据类型private T a;public T getA(T b){return a;}}//具体的实现如下:Test<Integer> t = new Test<>();//使用Integer类型指定 T 具体是什么

3、 泛型类相关知识

  • 泛型类在创建对象的时候,来指定操作的具体类型
  • 如果在创建对象的时候没有指定具体类型,将会按照Object类型操作。
  • 泛型类不支持传入基本类型,因为传入的类型需要时Object的子类,在类型擦除的时候,如果没有extends,super,会默认把泛型参数变为Object,具体泛型擦除看下边
  • 泛型类型在逻辑上可以看成是不同数据类型,但实际上事相同的类型
  • 因为使用了泛型,我们可以在一个类中使用不同的数据类型如:Integer,String等

泛型子类

1、子类是泛型类

父类是泛型类,子类也是泛型类,子类中的泛型变量要有一个和父类的泛型要保持一致

class Test<T>{private T a;public T getA(T b){return a;}
}class Son1<T,K> extends Test<T>{ //如果父类是泛型类,子类要有一个泛型变量和父类保持一致
}
class Son2<K> extends Test<T>{ //报错:不保持一致会报错
}

2、子类不是泛型类

子类不是泛型类,父类要明确泛型的数据类型

class Test<T>{private T a;public T getA(T b){return a;}
}class Son1 extends Test<String>{ //子类不是泛型类,父类要明确泛型的数据类型
}
class Son2 extends Test<T>{ //报错:需要明确父类的泛型数据类型
}

泛型接口

泛型接口的定义语法

interface Test<T>{T get(T a);
}
class Son1<T,K> implements  Test<T>{@Overridepublic T get(T a) {return null;}
}
class Son2 implements Test<String>{@Overridepublic String get(String a) {return null;}
}
class Son3 implements Test{//如果不写的话,默认的T就会变成Object@Overridepublic Object get(Object a) {return null;}
}
  1. 实现类不是泛型类,接口要明确数据类型
  2. 实现类也是泛型类,实现类和接口的泛型类型要一致

泛型方法

  • pub1ic与返回值中间非常重要,可以理解为声明此方法为泛型方法。
  • 只有声明了的方法才是泛型方法,泛型类中的使用了泛型的成员方法并不是泛型方法。
  • 表明该方法将使用泛型类型T,此时才可以在方法中使用泛型类型T.
  • 与泛型类的定义一样,此处T可以随便写为任意标识,常见的如T、E、K、V等形式的参数常用于表示泛型。
  • 反向方法支持静态,但是泛型类中的成员方法不支持静态static的使用

举例如下:

class Test1{public <T> T geta(T a){return a;}
}
public class Main {public static void main(String[] args) {Test1 test1 = new Test1();Integer geta = test1.geta(1);//根据传入参数的类型指定泛型形参}
}

反向方法的可变参数

泛型方法总结:

  • 泛型方法能使方法独立于类而产生变化
  • 如果static方法要使用泛型能力,就必须使其成为泛型方法

类型通配符

类型通配符上限

类型通配符一般是使用?代替具体的类型参数,所以类型通配符是类型实参.
? extends Number,表示的是类型通配符的上线是Number

class Test1<T>{public void  get1(){}
}
public class Main{public static void main(String[] args) {get(new Test1<>());get1(new Test1<Integer>());}public static void get(Test1<?> test1){test1.get1();}public static void get1(Test1<? extends Number> test1){test1.get1();}
}

类型通配符下限

采用super关键字 ? super Number表示类型最低是Number

class Test1<T>{public void  get1(){}
}
public class Main{public static void main(String[] args) {get(new Test1<>());get1(new Test1<Number>());}public static void get(Test1<?> test1){test1.get1();}public static void get1(Test1<? super Number> test1){test1.get1();}

类型擦除

无限制的类型擦除

有限制的类型擦除

擦除方法中类型定义的参数

桥接方法
因为在编译的时候,为了保证实现类重写了接口的方法,虽然实现类有了Integer的方法,但是在泛型擦除的时候会在实现类中生成一个Object的方法。

泛型与数组

泛型数组的创建

  • 可以声明带泛型的数组引用,但是不能直接创建带泛型的数组对象
  • 可以通过java.lang.reflect.Array的newInstance(Class,int)创建T[]数组
  1. 方法一
    public static void main(String[] args) {ArrayList<String>[] a = new ArrayList<String>[4]; //错误案例ArrayList<String>[] b = new ArrayList[4];//创建数组}
  1. 方法二
class Test1<T>{private T[] arr;public Test1(Class<T> clz,int len){ //创建数组arr = (T[]) Array.newInstance(clz,len);}public void put(int index, T item){arr[index]=item;}
}

泛型与反射

    public static void main(String[] args) throws Exception {Class test1Class= Test1.class;Constructor constructor = test1Class.getConstructor();Object o = constructor.newInstance();}

反射常用的泛型类

Class<T>
Constructor<T>

Written By 知识浅谈Pro

相关文章:

由点到面贯穿整个Java泛型理解

泛型概述 Java泛型(generics)是DK5中引入的一个新特性&#xff0c;泛型提供了编译时类型安全监测机制&#xff0c;该机制允许我们在编译时检测到非法的类型数据结构。 泛型的本质就是参数化类型&#xff0c;也就是所操作的数据类型被指定为一个参数。 如我们经常使用的Array…...

北斗RTK高精度定位在AI领域的应用

随着北斗高精度定位技术越来越成熟&#xff0c;通过GNSS高精度定位与机器人结合&#xff0c;越来越多的智能机器人走进我们生活中。像驾培机器人、智能除草机器人、智能巡检机器人、北斗划线机器人等智能机器人已经广泛的投入使用。驾培机器人驾培机器人&#xff1a;通考车安装…...

2023年再不会 IOC 源码,就要被淘汰了

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱敲代码的小黄&#xff0c;独角兽企业的Java开发工程师&#xff0c;CSDN博客专家&#xff0c;阿里云专家博主&#x1f4d5;系列专栏&#xff1a;Java设计模式、数据结构和算法、Kafka从入门到成神、Kafka从成神到升仙…...

MQ面试题

1、为什么使用消息队列&#xff1f; 其实就是问问你消息队列都有哪些使用场景&#xff0c;然后你项目里具体是什么场景&#xff0c;说说你在这个场景里用消息队列是什么&#xff1f; 面试官问你这个问题&#xff0c;期望的一个回答是说&#xff0c;你们公司有个什么业务场景&…...

pnpm 基本详细使用(安装、卸载、使用)

一、简介 官网地址、GitHub地址、官方安装文档、官方卸载文档。 pnpm 全称 performant npm&#xff0c;意思为 高性能的 npm。pnpm 由 npm/yarn 衍生而来&#xff0c;解决了 npm/yarn 内部潜在的 bug&#xff0c;极大的优化了性能&#xff0c;扩展了使用场景。被誉为 最先进的…...

Kafka生产者的粘性分区算法

分区算法分类 kafka在生产者投递消息时&#xff0c;会根据是否有key采取不用策略来获取分区。 存在key时会根据key计算一个hash值&#xff0c;然后采用hash%分区数的方式获取对应的分区。 而不存在key时采用随机算法选取分区&#xff0c;然后将所有的消息封装到这个batch上直…...

java基础篇

1.基础篇注释注释是在程序指定位置添加的说明性信息注释不参与程序运行&#xff0c;仅起到说明作用单行注释 格式&#xff1a;// 注释信息多行注释 格式&#xff1a;/* 注释信息 */关键字关键字&#xff1a;就是被Java语言赋予了特定含义的单词java中共有53个关键字1.全部有小写…...

Java与Winform进行AES加解密数据传输的工具类与对应关系和示例

场景 AndroidJava中使用Aes对称加密的工具类与使用&#xff1a; AndroidJava中使用Aes对称加密的工具类与使用_霸道流氓气质的博客-CSDN博客 上面讲的Java与安卓进行数据传输时使用AES加解密的示例工具类。 如果Java需要与其他第三方平台比如Winform程序进行数据传递时也需…...

OpenAI模型的API调用与使用-测试(2)

OpenAI模型的API调用与使用-测试&#xff08;2&#xff09;1. 参考Quick start搭建一个demo1.1 安装openai包1.2 demo测试11.3 demo测试2参考资料1. 参考Quick start搭建一个demo 1.1 安装openai包 注意关掉科学上网工具&#xff0c;下载openai包 pip install openai安装好后…...

【LeetCode】剑指 Offer 22. 链表中倒数第k个节点 p136 -- Java Version

题目链接&#xff1a;https://leetcode.cn/problems/lian-biao-zhong-dao-shu-di-kge-jie-dian-lcof/ 1. 题目介绍&#xff08;22. 链表中倒数第k个节点&#xff09; 输入一个链表&#xff0c;输出该链表中倒数第k个节点。为了符合大多数人的习惯&#xff0c;本题从1开始计数&…...

经典卷积模型回顾7-轻量化模型MobileNet实现图像分类(matlab)

MobileNet是一种轻量级卷积神经网络&#xff0c;适用于较小的设备和低功耗环境。在MATLAB中&#xff0c;可以使用Deep Learning Toolbox进行MobileNet的图像分类训练。 使用预先训练好的MobileNet模型对自定义数据集进行微调训练&#xff1a; matlab % 导入数据集 imds im…...

程序员压力大?用 PyQt 做一个美*女GIF设置桌面,每天都有好心情

嗨害大家好鸭&#xff01;我是小熊猫~ 要说程序员工作的最大压力不是来自于工作本身&#xff0c; 而是来自于需要不断学习才能更好地完成工作&#xff0c; 因为程序员工作中面对的编程语言是在不断更新的&#xff0c; 同时还要学习熟悉其他语言来提升竞争力… 好了&#xff0c…...

Shell命令——sed命令

以下内容整理于《linux命令行与shell脚本编程大全【第三版】》一书。 一、简介sed编辑器 1、sed编辑器的本质 sed是stream editor的缩写&#xff0c;中文意思是“流编辑器”。 sed编辑器是一个命令行编辑器&#xff0c;也就是可以在命令行上完成数据的处理&#xff08;替换、…...

C语言练习 | 初学者经典练习汇(2)

目录 1、编写一个程序从1到100中&#xff0c;所有出现9的个数 2、分数求和 3、10个整形数字中选出最大值 4、打印9*9的乘法口诀 5、字符串逆序 6、计算一个数的每位之和(递归实现) 7、递归实现n的K次方 8、写个冒泡排序&#xff0c;把一个整形数组变成升序。 9、二进制…...

git分支

分支什么是分支在版本控制过程中&#xff0c;同时推进多个任务&#xff0c;为每个任务&#xff0c;我们就可以创建每个任务的单独分支。使用分支意味着程序员可以把自己的工作从开发主线上分离开来&#xff0c;开发自己分支的时候&#xff0c;不会影响主线分支的运行。对于初学…...

Java每天15道面试题 | redisII

1、什么是 Redis&#xff1f;简述它的优缺点&#xff1f; Redis 本质上是一个 Key-Value 类型的内存数据库&#xff0c;很像 memcached&#xff0c;整个数据库统统加载在内存当中进行操作&#xff0c;定期通过异步操作把数据库数据 flush 到硬盘上进行保存。因为是纯内存操作&a…...

浏览器渲染原理

阶段 - Parse 1、解析HTML&#xff0c;浏览器将从服务器获取到的HTML文件之后&#xff0c;会产生一个渲染任务&#xff0c;交给消息队列&#xff08;EventLoop/MessageLoop&#xff09;。 2、在事件循环机制的作用下&#xff0c;会将渲染任务交给主线程 3、主线程在获取到渲染…...

华为OD机试题 - 查找单入口空闲区域(JavaScript)| 含思路

华为OD机试题 最近更新的博客使用说明本篇题解:查找单入口空闲区域题目输入输出示例一输入输出说明示例二输入输出说明示例三输入输出说明示例四输入输出说明Code解题思路华为OD其它语言版本<...

制造型企业想要做好数字化改造,要注意以下几点!

很多企业在“工业4.0、智能制造、互联网”等概念满天飞的环境下迷失了方向&#xff0c;不知该如何下手&#xff0c;盲目跟风&#xff0c;看别人投自动化&#xff0c;自己也跟着投&#xff0c;看别人上信息化&#xff0c;自己也跟着上。 其实&#xff0c;智能制造也好&#xff…...

【蓝桥杯集训·每日一题】AcWing 1488. 最短距离

文章目录一、题目1、原题链接2、题目描述二、解题报告1、思路分析2、时间复杂度3、代码详解三、知识风暴Dijkstra算法一、题目 1、原题链接 1488. 最短距离 2、题目描述 有 N 个村庄&#xff0c;编号 1 到 N。 村庄之间有 M 条无向道路&#xff0c;第 i 条道路连接村庄 ai 和村…...

AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

RocketMQ延迟消息机制

两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数&#xff0c;对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后&#xf…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销&#xff0c;平衡网络负载&#xff0c;延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...

从WWDC看苹果产品发展的规律

WWDC 是苹果公司一年一度面向全球开发者的盛会&#xff0c;其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具&#xff0c;对过去十年 WWDC 主题演讲内容进行了系统化分析&#xff0c;形成了这份…...

SciencePlots——绘制论文中的图片

文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了&#xff1a;一行…...

3.3.1_1 检错编码(奇偶校验码)

从这节课开始&#xff0c;我们会探讨数据链路层的差错控制功能&#xff0c;差错控制功能的主要目标是要发现并且解决一个帧内部的位错误&#xff0c;我们需要使用特殊的编码技术去发现帧内部的位错误&#xff0c;当我们发现位错误之后&#xff0c;通常来说有两种解决方案。第一…...

UE5 学习系列(三)创建和移动物体

这篇博客是该系列的第三篇&#xff0c;是在之前两篇博客的基础上展开&#xff0c;主要介绍如何在操作界面中创建和拖动物体&#xff0c;这篇博客跟随的视频链接如下&#xff1a; B 站视频&#xff1a;s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...

【决胜公务员考试】求职OMG——见面课测验1

2025最新版&#xff01;&#xff01;&#xff01;6.8截至答题&#xff0c;大家注意呀&#xff01; 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:&#xff08; B &#xff09; A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...

算法笔记2

1.字符串拼接最好用StringBuilder&#xff0c;不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...

Spring是如何解决Bean的循环依赖:三级缓存机制

1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间‌互相持有对方引用‌,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...