java泛型学习
没有java泛型会存在的问题
- 假设我们有一个方法,希望通过传递不同类型的参数,输出不同类型的对象值。正常情况下我们可能会写不同的方法来实现,但是这样会导致类不断增加,并且类方法很相似,不能够复用。进而导致类爆炸
- 假设有一个方法,我们希望传参具有一定约束,而不是像Object对象一样随便传参
java泛型的常见使用
包装类型参数
- 定义一个方法,打印各种包装类型
public class Generics1<T> {private T name;public Generics1(T name) {this.name = name;}public void allPrint(){System.out.println(name);}
}
- main
public class Main {public static void main(String[] args) {Generics1<Integer> integerGenerics1 = new Generics1<>(1);integerGenerics1.allPrint();Generics1<String> stringGenerics2 = new Generics1<>("222222");stringGenerics2.allPrint();Generics1<Long> longGenerics3 = new Generics1<>(222L);longGenerics3.allPrint();}
}
注意:泛型里面必须是对象,或者包装类型。基础类型是不被允许的
多个包装类型参数
- 两个泛型参数
public class Generics2<T,K> {private T name;private K context;public Generics2(T name,K context) {this.name = name;this.context=context;}public void allPrint(){System.out.println(name);System.out.println(context);}
}
- Main
public class Main2 {public static void main(String[] args) {Generics2<String, Integer> stringIntegerGenerics2 = new Generics2<>("1111", 222);stringIntegerGenerics2.allPrint();}
}
上界继承
- 限定使用者传递的参数必须继承某个父类之下
public class Generics3<T extends Vehicle> {private T name;public Generics3(T name) {this.name = name;}public void allPrint(){System.out.println(name.getName());}
}
- 父类
public class Vehicle {private String name;public String getName() {return name;}public void setName(String name) {this.name = name;}public void run(String name){System.out.println(name+"can run");}
}
- 子类
public class Car extends Vehicle{private Integer wheel;public Integer getWheel() {return wheel;}public void setWheel(Integer wheel) {this.wheel = wheel;}public void getWheel(String name,Integer wheel) {System.out.println(name+"有"+wheel+"个轮子");}
}
- 可以不是父 类,可以是接口。接口有更好的扩展性
public class Generics4<T extends Vehi> {private T vehics;public Generics4(T vehics) {this.vehics = vehics;}public void allPrint(){vehics.run();}
}
- 接口
public interface Vehi {void run();
}
使用上界继承的好处
- 使用上界继承的最大好处是:必然我们会用到接口或者父类,那么我们可以抽取一些公共方法,放到父类或接口里面。不同的实现拥有不同的处理方式。具备更强的扩展性
- java里面虽然有Object来实现传递各种类型参数(如下),但是不推荐这么做。会产生一种。例如:当我们从List取值的时候,java是无法推断里面值的类型,编译器就会报错

上面这个代码在运行时,获取第二个值时,就会报错。
使用Object,在编译阶段是没有问题的,但是在运行时就会出现问题。
而使用泛型,在编译阶段,就能检查出来问题
泛型函数:Generic method
泛型函数方法的定义
- 在返回类型前添加泛型类型: 。参数设置为泛型
private static <T> void printAll(T myOb){
}
- 举例子
public class Main5 {public static void main(String[] args) {printAll(new BigCar(3,"myba"));}private static <T> void printAll(T myOb){System.out.println(myOb);}
}
- 同理也可以使用上界继承限定
private static <T> void printAll(T myOb){System.out.println(myOb);}
private static <T extends Vehicle & Vehi> void printAll(T myOb){System.out.println(myOb);
}
- 配置多个参数
private static <T,K> void printAll2(T myOb,K myob2){System.out.println(myOb);System.out.println(myob2);
}
泛型通配符
- String,Integer,Long我们在传递参数时,可以用Object来定义参数。但是:List,却不是List的子类。这种情况怎么处理?
- 通配符的使用
private static void printAll(List<?> myOb){System.out.println(myOb);
}
上界通配符
- 意思是,传入的参数必须是Vehi的子类或者实现,或者本身
private static void printAll(List<? extends Vehi> myOb){System.out.println(myOb);
}
下界通配符
- 意思是传入的参数必须是Car的父类或者Car本身
private static void printAll(List<? super Car> myOb){System.out.println(myOb);
}
相关文章:
java泛型学习
没有java泛型会存在的问题 假设我们有一个方法,希望通过传递不同类型的参数,输出不同类型的对象值。正常情况下我们可能会写不同的方法来实现,但是这样会导致类不断增加,并且类方法很相似,不能够复用。进而导致类爆炸…...
vscode c++ 开发环境配置
今天各位同学已经安装了mingw环境,但部分同学vscode开发环境又问题,究其原因,还是vscode 编译环境配置错误,有问题的同学 按如下步骤处理: 1、卸载相关插件。按下列步骤重新安装插件。 2、继续在搜索框中搜索并安装 C…...
PHP安装配置
文章目录 1.下载PHP2.配置环境变量3.Apache安装配置 1.下载PHP PHP即“超文本预处理器”,是一种通用开源脚本语言。PHP是在服务器端执行的脚本语言,与C语言类似,是常用的网站编程语言。PHP独特的语法混合了C、Java、Perl以及 PHP 自创的语法…...
std::vector<>的{}用法与stl中的共享指针
讨论 std::vector<>的{}用法比较方便,在stl中的共享指针中是否适用? 代码 #include <iostream> #include <memory> #include <vector> using namespace std;int main() {vector<int> vt1({1,3,5});vec…...
《FFmpeg开发实战:从零基础到短视频上线》资源下载和内容勘误
资源下载 下面是《FFmpeg开发实战:从零基础到短视频上线》一书用到的工具和代码资源: 1、本书使用的FFmpeg版本为FFmpeg 5.1.2,也可在FFmpeg的github主页上下载最新的FFmpeg源码。 2、本书第12章使用的Android Studio版本为Android Studio D…...
OpenCV目标识别
一 图像轮廓 具有相同颜色或强度的连续点的曲线。 图像轮廓的作用 可以用于图像分析 物体的识别与检测 注意 为了检测的准确性,需要先对图像进行二值化或Canny操作。 画轮廓时会修改输入的图像。 轮廓查找的API findContours(img,mode,ApproximationMode,...)…...
密码学及其应用——为什么选择接近的质数因子对RSA加密算法不安全?
RSA加密算法是一种广泛使用的非对称加密算法,它的安全性依赖于大整数分解的难度。具体来说,RSA算法生成的公钥包含一个大整数N,这是两个大质数p和q的乘积。然而,如果这两个质数p和q太接近,则可以相对容易地对N进行因式…...
爱心商城管理系统的设计
管理员账户功能包括:系统首页,个人中心,管理员管理,企业管理,用户管理,论坛管理,商品管理,公告管理,用户捐赠 企业账户功能包括:系统首页,个人中…...
【python】linux下安装chromedriver
首先,安装selenium模块 pip3 install selenium查看系统内chrome版本: google-chrome --version 根据谷歌浏览器版本下载对应的浏览器驱动版本: wget https://storage.googleapis.com/chrome-for-testing-public/126.0.6478.114/linux64/ch…...
Day18—使用Scrapy框架快速开发爬虫
Scrapy是一个强大的Python框架,用于快速开发爬虫程序。它提供了一整套工具来处理网页爬取和数据提取,非常适合于数据挖掘和信息抓取。本文将详细介绍如何使用Scrapy框架,包括创建项目、编写爬虫规则、设置中间件和管道等。 1. Scrapy框架概述 Scrapy框架以其高性能、易用性…...
04--MySQL8.0_JDBC
第一章 JDBC概述 之前我们学习了JavaSE,编写了Java程序,数据保存在变量、数组、集合等中,无法持久化,后来学习了IO流可以将数据写入文件,但不方便管理数据以及维护数据的关系; 后来我们学习了数据库管理软件MySQL,可以方便的管理数据1。 那么如何将它俩结合起来呢?即…...
OPENCV中0x00007FFE5F35F39C发生异常
原因:读取图片时已经为灰度图像,又进行了一次灰度处理cvtColor 解决方法:如上图所示,将cv::imread的第二个参数改为cv::IMREAD_COLOR;或者保留cv::IMREAD_GRAYSCALE,删去后面的cv::cvtColor...
Python 设计模式(第2版) -- 第三部分(行为型模式)
Python 设计模式(第2版) 再介绍下行为型设计模式。 行为型模式,顾名思义,它主要关注的是对象的责任。它们用来处理对象之间的交互,以实现更大的功能。行为型模式建议:对象之间应该能够彼此交互,同时还应该是松散耦合…...
EXCEL数据导入HIVE
引言 本文将论述如何将Windows本地的excel表数据,导入到虚拟机Linux系统中的Hadoop生态中的Hive数据仓库中。 实验准备 DBeaver Hive3.1(Hadoop3.1) excel数据表 实验步骤 一、首先打开虚拟机,启动Hadoop,启动h…...
C语言常用标准头文件
头文件的基础概念 在C的系列语言程序中,头文件(通常扩展名为.h)被大量使用,它通常包含函数、变量、结构体等的声明和定义,以及一些宏定义和类型定义。头文件的主要作用是为了方便管理和重用代码,它可以被多…...
vuejs3用gsap实现动画
效果 gsap官网地址: https://gsap.com/ 安装gsap npm i gsap 创建Gsap.vue文件 <script setup> import {reactive, watch} from "vue"; import gsap from "gsap"; const props defineProps({value:{type:Number,default:0} }) cons…...
企业级-PDF文件下载
作者:fyupeng 技术专栏:☞ https://github.com/fyupeng 项目地址:☞ https://github.com/fyupeng/rpc-netty-framework 留给读者 一、介绍 文件下载在浏览器可以根据响应头设置纯下载和直接打开两种方式。 二、代码 RequestMapping("/…...
00 - React 基础
1. React 基础 安装react指令 可参考: 官网官网使用教程 如: npx create-react-app 项目名 如:npx create-react-app react-redux-proJSX JSX 是一种 JavaScript 的语法扩展,类似于 XML 或 HTML,允许我们在 Java…...
基于WPF技术的换热站智能监控系统17--项目总结
1、项目颜值,你打几分? 基于WPF技术的换热站智能监控系统01--项目创建-CSDN博客 基于WPF技术的换热站智能监控系统02--标题栏实现-CSDN博客 基于WPF技术的换热站智能监控系统03--实现左侧加载动画_wpf控制系统-CSDN博客 基于WPF技术的换热站智能监…...
CI /CD学习
CI/CD概述 CI/CD 是持续集成和持续交付/部署的缩写,旨在简化并加快软件开发生命周期。 持续集成(CI)是指自动且频繁地将代码更改集成到共享源代码存储库中的做法。持续交付和/或持续部署(CD)是一个由两部分组成的过程…...
基于YOLO的安全帽佩戴检测系统~Python+模型训练+2026原创+YOLO算法
项目简介 基于 YOLO 的智能安全帽佩戴检测平台,面向施工现场图片识别、检测记录管理与安全宣传信息展示等业务场景。系统后端采用 Flask 搭建 RESTful API 服务,结合数据库进行业务数据持久化存储,并通过 JWT 实现用户身份认证与接口访问控制…...
Spring Cloud集成Nacos配置中心常见问题解析
1. Spring Cloud集成Nacos配置中心常见问题解析 在微服务架构中,配置中心是必不可少的基础组件。Nacos作为阿里巴巴开源的一款集服务发现、配置管理于一体的中间件,凭借其轻量级、高可用等特性,已经成为Spring Cloud生态中配置中心的热门选择…...
别再让AI单打独斗了:用MCP协议手把手教你搭建一个能‘对话’的智能体协作系统
从零构建智能体协作系统:基于MCP协议的周末旅行规划实战 想象一下这样的场景:周五晚上,你对着手机说"帮我规划一个去杭州的周末旅行",30秒后,一份完整的行程建议出现在屏幕上——包含根据实时天气推荐的穿搭…...
超越GUI:用Tcl命令流高效编辑Tessent DftSpecification的三种进阶玩法
超越GUI:用Tcl命令流高效编辑Tessent DftSpecification的三种进阶玩法 在大型SoC项目中,频繁修改IJTAG网络结构是每位资深DFT工程师的日常。当设计迭代进入深水区,图形界面操作和手动文本编辑的效率瓶颈会愈发明显——每次增减SIB、调整TDR位…...
手把手教你解决HarmonyOS项目中的hvigor版本冲突问题(含API8/9兼容方案)
HarmonyOS开发实战:彻底解决hvigor版本冲突与API兼容性问题 上周团队新来的工程师小王在调试P40设备时突然惊呼:"这报错太诡异了!明明代码没问题,为什么安装包死活装不上?"我凑近一看,控制台正显…...
别怕C++!手把手拆解TinyML测试框架:用micro_test.h给你的嵌入式AI代码加个‘保险丝’
嵌入式AI开发者的测试实战指南:用micro_test.h构建TinyML质量防线 在资源受限的微控制器上开发AI应用时,一个被反复验证的真理是:没有自动化测试的代码就像没有安全网的走钢丝。当你的神经网络模型需要在仅有几KB内存的设备上运行时ÿ…...
5分钟学会用AI将手绘草图转为专业科研图表代码
5分钟学会用AI将手绘草图转为专业科研图表代码 【免费下载链接】DeTikZify Synthesizing Graphics Programs for Scientific Figures and Sketches with TikZ 项目地址: https://gitcode.com/gh_mirrors/de/DeTikZify 你是否曾因绘制科研图表而烦恼?面对复杂…...
从大疆NAZA换到匿名P2飞控:一个DIY玩家的真实体验与参数调试避坑指南
从大疆NAZA到匿名P2飞控:一位DIY玩家的深度迁移指南 当我的F450机架在狭小卧室里显得笨拙不堪时,我意识到需要一次彻底的"瘦身计划"。这不是简单的机架更换,而是一次从商业飞控到开源系统的完整迁移——将大疆NAZA积累的经验移植到…...
终极PDF批量处理指南:如何用PDF Arranger自动化文档操作
终极PDF批量处理指南:如何用PDF Arranger自动化文档操作 【免费下载链接】pdfarranger Small python-gtk application, which helps the user to merge or split PDF documents and rotate, crop and rearrange their pages using an interactive and intuitive gra…...
JMeter vs Claude Code:从“约束系统“到“解放系统“的工程设计范式跃迁
当你还在用 JMeter 写线程组的时候,Claude Code 已经在用自然语言编排测试工作流了。这不是工具的迭代,是工程设计范式的代际更替。前言:两代工程设计哲学的碰撞 2026 年,AI 编程工具已经从"代码生成器"进化为"自主…...
