Java进阶学习笔记21——泛型概念、泛型类、泛型接口
泛型:
定义类、接口、方法的时候,同时声明了一个或者多个类型变量(如: <E>),称之为泛型类、泛型接口、泛型方法,我们统称之为泛型。

说明这是一个泛型类。
如果不使用泛型,我们可以往ArrayList中传入各种对象,get方法返回的是Object类对象。

package cn.ensource.d8_generics;import java.util.ArrayList;public class Test {public static void main(String[] args) {// 目标:认识泛型ArrayList list = new ArrayList();list.add("a");list.add(123);list.add("黑马");Cat a = new Cat();list.add(a);for (int i = 0; i < list.size(); i++) {String res = (String) list.get(i); // 强转System.out.println(res);}}
}
强制类型转换会导致类型转换异常:

使用泛型类型为String类型,现在我给的是Cat对象,所以报错。

package cn.ensource.d8_generics;import java.util.ArrayList;public class Test {public static void main(String[] args) {// 目标:认识泛型
// ArrayList list = new ArrayList();
// list.add("a");
// list.add(123);
// list.add("黑马");
// Cat a = new Cat();
// list.add(a);
//
// for (int i = 0; i < list.size(); i++) {
// String res = (String) list.get(i); // 强转
// System.out.println(res);
// }System.out.println("-----------------------");ArrayList<String> list1 = new ArrayList<>(); // JDK1.7 开始,后面的数据类型可以不声明list1.add("Java1");list1.add("Java2");list1.add("Java3");list1.add("Java4");
// list1.add(new Cat());for (int i = 0; i < list1.size(); i++) {String res = list1.get(i);System.out.println(res);}}
}
作用:泛型提供了在编译阶段约束所能操作的数据类型,并自动进行检查的能力!这样可以避免强制类型转换,及其可能出现的异常。
泛型的本质:把具体的数据类型作为参数传给类型变量。
自定义泛型类:这就是C++的template

package cn.ensource.d9_generics_class;// 泛型类的定义
public class MyArrayList<E> {Object[] obj = new Object[10];private int size;public boolean add(E e) {arr[size++] = e;return true;}public E get(int index) {return (E) obj[index];}
}
多个类型变量:
package cn.ensource.d9_generics_class;public class MyArrayList2<E, T> {public void put(E e, T t) {}}
有继承约束关系的类型变量,后面只能定义Animal及其子类类型。
package cn.ensource.d9_generics_class;public class MyClass3<E extends Animal> {}
泛型接口:

Student类:
package cn.ensource.d10_generics_interface;public class Student {
}
Teacher类:
package cn.ensource.d10_generics_interface;public class Student {
}
Data泛型接口:
package cn.ensource.d10_generics_interface;import java.util.ArrayList;public interface Data<T> {void add(T t);ArrayList<T> getByName(String name);}
TeacherData实现接口类:
package cn.ensource.d10_generics_interface;import java.util.ArrayList;public class TeacherData implements Data<Teacher> {@Overridepublic void add(Teacher teacher) {}@Overridepublic ArrayList<Teacher> getByName(String name) {return null;}
}
StudentData实现接口类:
package cn.ensource.d10_generics_interface;import java.util.ArrayList;public class StudentData implements Data<Student> {@Overridepublic void add(Student student) {}@Overridepublic ArrayList<Student> getByName(String name) {return null;}
}
测试类:
package cn.ensource.d10_generics_interface;public class Test {public static void main(String[] args) {// 目标:掌握泛型接口的定义和使用// 场景:我们的系统需要处理学生和老师的数据,保存对象数据,根据名称查询数据}
}
注意:
类型变量建议是大写的英文字母,常用的有E/T/K/V等。
相关文章:
Java进阶学习笔记21——泛型概念、泛型类、泛型接口
泛型: 定义类、接口、方法的时候,同时声明了一个或者多个类型变量(如: <E>),称之为泛型类、泛型接口、泛型方法,我们统称之为泛型。 说明这是一个泛型类。 如果不使用泛型,我们可以往ArrayList中传…...
第二天-⑦前后端需要注意的事项
①防xss跨站脚本攻击...
Socket 函数详细讲解(Socket编程步骤、socket函数、TCP和UDP的区别)
Socket 函数详细讲解和 C 示例 一、 Socket 基本概念1. Socket 简介2. Socket 编程步骤3. TCP Socket 编程示例服务器端客户端 4. 详细说明 二、 socket 函数1. domain 通讯的协议家族2. type 数据传输的类型3. protocol 最终使用的协议返回值示例 三、TCP 和 UDP的区别1. TCP&…...
【限免】杂波环境下线性调频脉冲、巴克码、频率步进脉冲雷达MTI、脉冲压缩【附MATLAB代码】
来源:微信公众号:EW Frontier 本代码主要模拟杂波环境(飞机、地杂波、鸟类信号)下,Chirp脉冲、巴克码脉冲、频率步进脉冲雷达信号的脉冲压缩及MTI、匹配滤波。 MATLAB主代码 % 定义参数 fs 1000; % 采样率 T 1; …...
前端最新面试题(Javascript模块篇)
目录 1 数据类型基础 1.1 JS内置类型 1.2 null和undefined区别 1.3 null是对象吗?为什么? 1.4 1.toString()为什么可以调用? 1.5 0.1+0.2为什么不等于0.3?如何让其相等 1.6 如何理解BigInt 1.7 JS 整数是怎么表示的 1.8 Number() 的存储空间是多大?如果后台发送了…...
Android11热点启动和关闭
Android官方关于Wi-Fi Hotspot (Soft AP) 的文章:https://source.android.com/docs/core/connect/wifi-softap?hlzh-cn 在 Android 11 的WifiManager类中有一套系统 API 可以控制热点的开和关,代码如下: 开启热点: // SoftApC…...
DI-engine强化学习入门(三)DI-ZOO强化学习环境搭建与示例运行——Atari
Atari是一家知名的电子游戏公司,成立于1972年,是早期电子游戏产业的先驱之一。在强化学习领域,提到Atari通常指的是Atari 2600游戏的一系列环境,这些环境是用于开发和测试强化学习算法的标准平台。 Atari 2600 强化学习环境概述 …...
【一站式学会Kotlin】第十节:kotlin 语言的可控性特点和安全调用操作符
作者介绍: 百度资深Android工程师T6,在百度任职7年半。 目前:成立赵小灰代码工作室,欢迎大家找我交流Android、微信小程序、鸿蒙项目。= 一:通俗易懂的人工智能教程:https://www.captainbed.cn/nefu/ 点一下,打开新世界的大门。 二:【一站式学会Kotlin】免费领取:作者…...
PaddleClas 指定gpu
在使用PaddleClas进行模型训练或预测时,如果您想要指定使用特定的GPU设备,可以通过CUDA_VISIBLE_DEVICES环境变量来设置。 在命令行中设置GPU的方法如下: # 指定第0号GPU export CUDA_VISIBLE_DEVICES0 # 之后运行PaddleClas的命令…...
langchain进阶一:特殊的chain,轻松实现对话,与数据库操作,抽取数据,以及基于本地知识库的问答
特殊的chain langchain中的Chain有很多,能够轻松实现部分需求,极致简化代码,但是实现效果与模型智慧程度有关 会话链 效果与LLMChain大致相同 javascript 复制代码 from langchain.chains import ConversationChain from langchain_community.llms import OpenAI conversat…...
【Spring Boot】响应式编程
响应式编程 1.WebFlux2.比较 MVC 和 WebFlux2.1 工作方式2.2 Spring MVC 与 Spring WebFlux 的区别2.3 使用 WebFlux 的好处 3.Mono 和 Flux3.1 Mono 和 Flux 是什么3.2 Mono 和 Flux 的区别 4.开发 WebFlux 的流程4.1 注解式开发流程4.2 响应式开发流程 5.用注解式开发实现 He…...
【C++练级之路】【Lv.21】C++11——列表初始化和声明
快乐的流畅:个人主页 个人专栏:《算法神殿》《数据结构世界》《进击的C》 远方有一堆篝火,在为久候之人燃烧! 文章目录 引言一、列表初始化1.1 内置类型1.2 结构体或类1.3 容器 二、声明2.1 auto2.2 decltype2.3 nullptr 三、STL的…...
输入一串字符串,前中后都有*号,去掉字符串中间和后面的*号,保留前面的*号和字母
#include <stdio.h> void fun(char* a) {//***df**fr*fg***int i 0, j 0,n0,m0;char* p;p a;while (p[i] ! \0){i;//i是一共的字符的个数}printf("%d\n",i);while (a[n] *){n;//计算字母前的*的个数}printf("%d\n", n);m n;for (j n; j < …...
【机器学习与大模型】驱动下的应用图像识别与处理
摘要: 本文深入探讨了机器学习在图像识别与处理领域的应用,特别是在大模型的推动下所取得的巨大进展。详细阐述了图像识别与处理的基本原理、关键技术,以及机器学习算法和大模型如何提升其性能和准确性。通过实际案例分析了其在多个领域的广泛…...
24李林跌落神坛,880还刷吗?还是换1000、900、660?
“李林今年跌落神坛了!” “全是固定题型没新题,结果今年考的全是新题。” 880是“老真题的神”, 遇到24年,冷门考点多,计算量又大,就不灵了。 但“老真题”,还是得刷。就像往年真题是要刷的…...
数据库漫谈-sybase
sybase就是“system”加“database”,代表着信息系统的底层。Sybase公司很早就推出了关系数据库产品(1987年5月推出的Sybase SQLServer1.0)。Sybase也是第一个提出Client/Server 体系结构的思想,并率先在Sybase SQLServer 中实现。…...
Springboot开发 -- Postman 调试类型详解
引言 在 Spring Boot 应用开发过程中,接口测试是必不可少的一环。Postman 作为一款强大的 API 开发和测试工具,可以帮助开发者轻松构建、测试和管理 HTTP 请求。本文将为大家介绍如何在 Spring Boot 开发中使用 Postman 进行接口测试。 一、准备工作 安…...
Windows 后台启动jar并且输出日志到特定日志
Windows 后台启动jar并且输出日志到特定日志 javaw -Dfile.encodingutf-8 -jar xxx.jar >log.log 2>&1 &日志输出以年月日格式显示 javaw -Dfile.encodingutf-8 -jar xxx.jar >log_%DATE:~0,4%-%DATE:~5,2%-%DATE:~8,2%_%TIME:~0,2%-%TIME:~3,2%-%TIME:~6,2…...
垃圾回收机制及算法
文章目录 概要对象存活判断引用计数算法可达性分析算法对象是否存活各种引用 垃圾收集算法分代收集理论复制算法标记清除算法标记-整理算法 概要 垃圾收集(Garbage Collection, 下文简称GC),其优缺点如下: 优点&#…...
避坑指南:JMeter WebSocket插件安装常见5大错误及解决方案(附插件管理器使用技巧)
JMeter WebSocket测试全攻略:从插件安装到实战避坑 JMeter作为一款开源的性能测试工具,其强大的扩展性让它可以应对各种协议测试需求。WebSocket作为现代实时通信的核心协议,在JMeter中的测试支持却需要额外插件来实现。本文将带你深入理解JM…...
LLM服务SLA从99.5%跃升至99.99%的6个工程化动作(附奇点大会现场压测对比数据)
第一章:LLM服务SLA从99.5%跃升至99.99%的工程化跃迁全景图 2026奇点智能技术大会(https://ml-summit.org) 实现LLM服务可用性从99.5%(年宕机约43.8小时)到99.99%(年宕机≤52.6分钟)的跃迁,绝非简单扩容或…...
CloudDrive实战:轻松将115网盘挂载为本地磁盘,享受无缝存储体验
1. 为什么需要将网盘挂载为本地磁盘? 每次打开网盘客户端才能上传下载文件,是不是觉得特别麻烦?想象一下,如果你的网盘能像电脑里的D盘、E盘一样直接出现在"此电脑"里,所有操作都跟本地文件一模一样…...
LaTeX新手必看:5个Word用户最常踩的排版坑及LaTeX解决方案
LaTeX新手必看:5个Word用户最常踩的排版坑及LaTeX解决方案 当你第一次从Word切换到LaTeX时,可能会感到既兴奋又困惑。Word的所见即所得(WYSIWYG)界面让我们习惯了通过点击按钮来调整格式,而LaTeX则需要通过代码来控制排…...
微信小程序地图组件实战:动态轨迹绘制与实时定位融合
1. 微信小程序地图组件基础入门 微信小程序的地图组件(map)是开发位置相关功能的核心利器,它就像一张空白的画布,开发者可以通过API在上面绘制各种标记和路线。我刚开始接触这个组件时,发现它比想象中强大得多——不仅能显示静态地图…...
如何用Cyberbrain在5分钟内调试复杂的Python循环问题
如何用Cyberbrain在5分钟内调试复杂的Python循环问题 【免费下载链接】Cyberbrain Python debugging, redefined. 项目地址: https://gitcode.com/gh_mirrors/cy/Cyberbrain 调试Python循环问题常常让开发者头疼,尤其是面对多层嵌套或复杂逻辑时,…...
Wan2.1-umt5在网络安全领域的应用:智能日志分析与威胁检测
Wan2.1-umt5在网络安全领域的应用:智能日志分析与威胁检测 最近和几个做安全运维的朋友聊天,他们都在抱怨同一个问题:每天面对海量的系统日志、网络流量日志,眼睛都快看花了,但还是怕漏掉那些真正危险的信号。传统的规…...
2026年,这家大型快拼箱源头工厂直销厂家,究竟有何独特之处?
在快拼箱行业蓬勃发展的2026年,众多厂家如雨后春笋般涌现,但衡水贝客科技有限公司(简称贝客房屋)却凭借其独特的优势脱颖而出,成为行业内备受瞩目的大型快拼箱源头工厂直销厂家。接下来,让我们深入探究贝客…...
5分钟掌握SketchUp STL插件:从3D建模到3D打印的完整转换指南
5分钟掌握SketchUp STL插件:从3D建模到3D打印的完整转换指南 【免费下载链接】sketchup-stl A SketchUp Ruby Extension that adds STL (STereoLithography) file format import and export. 项目地址: https://gitcode.com/gh_mirrors/sk/sketchup-stl 你是…...
层理岩体的蠕变特性总让人又爱又恨。今儿咱们拿PFC2D整点有意思的——单级加载直接怼到位,分级加载玩心跳分阶段,最后再搞个剪切蠕变收尾。别慌,咱用代码说话
PFC2D层理岩体单级/分级蠕变(含剪切蠕变模拟)先整点基础活,创建层理模型得注意节理面的bond设置。下面这段是生成层理岩体的核心: ball generate box -10 10 -5 5 radius 0.1 0.15 contact cmat default model linearpbond conta…...
