泛型 类 接口 方法 通配符
泛型
泛型类
what:
类型参数化
why use:
1. 输出时候是object类型 而不是真正类型转化麻烦
import java.util.ArrayList;
import java.util.List;public class ObjectExample {public static void main(String[] args) {List<Object> list = new ArrayList<>();list.add("Hello");list.add(123); // 可以添加任何类型的对象// 运行时可能会出现 ClassCastExceptionString str = (String) list.get(1); System.out.println(str);}
}
一个盒子 什么类型都可以装
而不是 橘子 苹果 火龙果盒子
分别对应一个类
fault example:
package box;import fruit.*;public class box {
}public class appleBox{private apple apple;private double length;private double width;private double heigth;private double count;private double weigth;appleBox(){}appleBox(apple apple,double length,double width,double heigth,double count,double weigth){this.apple = apple;this.length = length;this.width = width;this.heigth = heigth;this.count = count;this.weigth = weigth;}public class orangeBox{private orange orange;private double length;private double width;private double heigth;private double count;private double weigth;orangeBox(){}orangeBox(orange orange, double length, double width, double heigth, double count, double weigth){this.orange = orange;this.length = length;this.width = width;this.heigth = heigth;this.count = count;this.weigth = weigth;}public class pitayaBox{private pitaya pitaya;private double length;private double width;private double heigth;private double count;private double weigth;pitayaBox(){}pitayaBox(pitaya pitaya,double length,double width,double heigth,double count,double weigth){this.pitaya = pitaya;this.length = length;this.width = width;this.heigth = heigth;this.count = count;this.weigth = weigth;}}
- 代码冗余:每个盒子类的逻辑几乎相同,只是类型不同,但需要重复编写。
- 扩展性差:如果需要支持更多类型的水果,就需要继续添加更多的盒子类。
- 维护困难:如果需要修改盒子的功能(如增加新的方法),需要在每个盒子类中逐一修改。
example:
bug1:构造函数不公开化 外部无法构造
/*构造函数公开化*/public boxGeneric(T fruit, double length, double width, double heigth, double count, double weigth) {this.fruit = fruit;this.length = length;this.width = width;this.heigth = heigth;this.count = count;this.weigth = weigth;}
泛型实例:
package box;/*
what:generic 类型参数化*/
public class boxGeneric<T> {/*what:不同部分只是水果类型 给他类型参数化但是我接收时候只能接收一种水果类型 然后对应对象确定了 是 苹果盒子/橘子盒子 然后就当苹果盒子正常使用*/private T fruit;private double length;private double width;private double heigth;private double count;private double weigth;/*构造函数公开化*/public boxGeneric(T fruit, double length, double width, double heigth, double count, double weigth) {this.fruit = fruit;this.length = length;this.width = width;this.heigth = heigth;this.count = count;this.weigth = weigth;}public T getFruit() {return fruit;}public void setFruit(T fruit) {this.fruit = fruit;}public double getLength() {return length;}public void setLength(double length) {this.length = length;}public double getWidth() {return width;}public void setWidth(double width) {this.width = width;}public double getHeigth() {return heigth;}public void setHeigth(double heigth) {this.heigth = heigth;}public double getCount() {return count;}public void setCount(double count) {this.count = count;}public double getWeigth() {return weigth;}public void setWeigth(double weigth) {this.weigth = weigth;}
}
调用:
import box.boxGeneric;
import fruit.apple;public class Main {public static void main(String[] args) {/*使用泛型水果盒子*/apple apple = new apple();boxGeneric<fruit.apple> appleboxGeneric = new boxGeneric<>(apple, 1, 1, 1, 1, 1);System.out.println(appleboxGeneric.getFruit().getName());}}
apple类型
package fruit;public class apple {private final String name = "apple";public String getName() {return name;}
}
语法
创建 参数化类
class boxGeneric<T>(T fruit){T fruit;}
创建泛型对象
new boxGeneric<>()alt + enter

接口使用
接口后要立马接收参数 类型参数
类后要立马接收参数 类型参数
接口
package interfaceModle;
/*
what:接口使用泛型 参数要紧紧跟着类呀*/
public interface keyInterface<T> {/*接口函数返回类型为泛型*/T getKey();
}
使用1:实现泛型接口的类 不是泛型类 实现类不用接收参数类型 接口还要由实现类给出参数 那么 我们自己指定接口的类型参数
这时实现类使用接口时候 要给出接口的类型参数 因为外部无法给出参数类型 只能我自己给,如果实现类 不给接口参数 默认给接口Object类型
package imple;import interfaceModle.keyInterface;
/*
非泛型类 要给接口类型参数*/
public class keyImple implements keyInterface<String> {@Overridepublic String getKey() {return "This is a key ------ 并非generic 是由实现类直接指定类型";}
}
main:
/*what:实现类直接指定类型 的 实现类返回信息*/public static void test2(){keyImple keyImple = new keyImple();System.out.println(keyImple.getKey());}
使用2:实现类接收外部的类型参数 接口泛型参数由实现类给出 则接口的类型参数 可以与实现类参数一致 ,也可以直接由实现类给出
package imple;import interfaceModle.keyInterface;/*
what:实现类接收类型参数 赋值给接口参数*/
public class keyGenericImple<T,E> implements keyInterface<T> {private T key;private E value;public keyGenericImple(T key, E value) {this.key = key;this.value = value;}public E getValue() {return value;}public void setValue(E value) {this.value = value;}@Overridepublic T getKey() {return key;}public void setKey(T key) {this.key = key;}
}
main
/*what:实现类接收类型参数 发给接口的类型参数确定类型参数 设置普通参数值 返回信息*/public static void test3(){keyGenericImple<String, Integer> si = new keyGenericImple<>("你好", 114514);String key = si.getKey();Integer value = si.getValue();System.out.println(key + " = " + value);}
方法使用
在调用方法时候指明泛型的具体类型
泛型类 作用在 返回值 参数上 但 方法内部无法使用泛型
即 泛型类只在类内部使用 方法内部使用泛型需要泛型方法
how use:
- 泛型类后面紧接所需要的参数
- 泛型方法后面无需紧跟参数 但是 泛型方法需要被修饰所以泛型标志在函数名前面
- 能用泛型方法里的泛型E,类的泛型T也可以用
how set parameter:
类的传递参数写在类的后面
getProduct<Integer> gp = new getProduct<>();
接口的类型参数写作接口后面
方法的类型参数写在 修饰符那里
泛型方法的类型参数 只能通过接收参数时候设置 方法泛型类型 其他没地方接收类型参数呀。。。。
example:
类管类的内部 方法管方法的内部及 方法返回值 方法参数
方法和类 同一个类型参数T 时候 设置一个T = 方法和类全部设置
泛型类 + 泛型方法设置参数
泛型方法
package methodGeneric;import java.util.ArrayList;
import java.util.Random;/*
what:给出任意类型列表 返回一个奖品*/
public class getProduct<E> {/*what:方法接收任意类型集合 返回一个奖品how use:方法类型参数 修饰作用 所以在最前面 声明后 该方法返回值 形式参数都可以使用该类型接收任意类型奖品列表how set type parameter:1.接收参数时候设置参数中的类型参数时 设置方法类型的参数*/Random rand = new Random();public <T> T getProductMethod(ArrayList<T> list) {return list.get(rand.nextInt(list.size()));}
}
传入泛型类 类型参数(类后面直接给出) 、泛型方法类型参数(方法参数设置参数)
/*
what:给出字符串类型奖品列表 返回奖品*/public static void test4(){ArrayList<String> list = new ArrayList<>();list.add("笔记本电脑");list.add("苹果手机");list.add("安卓手机");/*what:传给方法 抽出奖品*/getProduct<Integer> gP = new getProduct<>();String product = gP.getProductMethod(list);System.out.println("取出奖品为:" + product);
}/*
what:给出数字类型列表 抽出奖金*/
public static void test5(){ArrayList<Integer> products = new ArrayList<>();products.add(1000);products.add(20000);products.add(300000);getProduct<Integer> gP = new getProduct<>();Integer product = gP.getProductMethod(products);System.out.println("你的奖金为:" + product);
}
careout:
- 设置类泛型参数后 不一定设置方法的类型参数
- 类和方法类型参数名字就算一样 也是相互独立的
- 类的类型参数在实例化对象时设置
- 方法类型参数在接收 形式参数时设置
泛型类设置类型参数–成员方法 仅泛型类类型参数接收
泛型方法 任意类型参数接收
泛型类的成员方法 无法静态
泛型方法 可以静态 泛型方法不是泛型类的成员方法
泛型成员方法:
{getProduct<Integer> gP = new getProduct<>();/*what;数组*/int[] arr = {1000,20000,3000000};ArrayList<Integer> products = new ArrayList<>();for(int i = 0;i<arr.length;i++){products.add(arr[i]);}/*what:泛型实例化 给成员方法得到奖品*/getProduct<Integer> gp = new getProduct<>();Integer product0 = gp.getProduct0(products);System.out.println(product0 + " " + product0.getClass().getName());}
public class getProduct<E> {Random rand = new Random();/*what:泛型类的成员方法 成员方法全部依赖泛型类 比如 泛型类的类型参数返回奖品*/public E getProduct0(ArrayList<E> list) {return list.get(rand.nextInt(list.size()));}}
泛型方法;
public <T, E, K, V> void getMessage(T t,E e,K k,V v){System.out.println(t + "\t" + t.getClass().getName());System.out.println(e + " \t" + t.getClass().getName());System.out.println(k + " \t" + k.getClass().getName());System.out.println(v + " \t" + v.getClass().getName());}
public static void test7(){getProduct<Integer> gp = new getProduct<>();gp.getMessage("aaa","bbb",false,true);System.out.println("------------");gp.getMessage(true,false,1,22.66);}
泛型可变参数
泛型方法上E… e 泛型方法前设置修饰符
public static <E> void constantParameterPrint(E... e){for(int i = 0;i<e.length;i++){System.out.println(e[i]);}}
public static void test7(){getProduct<Integer> gp = new getProduct<>();gp.getMessage("aaa","bbb",false,true);System.out.println("------------");gp.getMessage(true,false,1,22.66);System.out.println("------------");gp.constantParameterPrint(1,2,3,4,5);System.out.println("------------");gp.constantParameterPrint('a','b','c','d','e');}
类型通配符
difficult:
1.Box box 这是一个Box对象 指明Box对象形式参数 创建Box实例对象 而不是一个列表 ArrayLIst arrayList 创建一个ArrayList对象 指明 Number参数 创建arrayList 实例对象
why use:
在用泛型对象作为参数时候 相当于实例化对象 这时候要给对象泛型类型发参数,说明函数有泛型类 实例化对象时 我们已经给该泛型 实例化对象设置了 泛型的类型 这时候 多种类型传入函数(泛型类 实例化对象已经指定) 这时候就会报错
interge 与 Number 在泛型类型参数里不能当作 父亲接收子 多态来理解
solve:
- 方法重载?
- 同名 不能形式参数 尽管泛型的接收类型参数不一样 但是他们都是泛型类 所以相同的参数 无法重载
- Object 泛型类类型参数
- 那么不利于上层接收调用 以为是Object类型
在函数形式参数 泛型类实例化对象 用问号代替类型参数 该泛型类接收所有类型的类型参数 然后实例化形式参数
example:
package typeWildcard;public class test {/*what:模拟多次 不同类型的泛型对象传入含有通配符函数返回Object类型 但是上一层强转类型即可*/public static void main(String[] args) {Box<Number> box1 = new Box<>();box1.setFirst(1);Number o = (Number)showBox(box1);System.out.println(o);System.out.println("-------------");Box<String> box2 = new Box<>();box2.setFirst("函数的形式参数 实例化 接收全部类型");String s = (String)showBox(box2);System.out.println(s);}/*what;函数的形式参数 实例化也需要指定泛型类的类型参数 这样无法多态public static void showBox(Box<Number> box){Number first = box.getFirst();}what effect:衬托无法多态 因为 形式参数 的类型都是泛型类 所以无法多态public static void showBox(Box<Integer> box){Number first = box.getFirst();}*//*what:1.对于函数形式参数为泛型类需要指明类型参数情况 使用问号 代表实例化时接收各种类型参数2.咱们使用Object接收 但是直接返回上一层因为上一层知道这个object是声明类型呀!!!*/public static Object showBox(Box<?> box){return box.getFirst();}}~~~java
package typeWildcard;/*
what:泛型类 当个函数形式参数实例化参数时候 必须要指定泛型类型参数*/
public class Box<T> {T first;public T getFirst() {return first;}public void setFirst(T first) {this.first = first;}
}相关文章:
泛型 类 接口 方法 通配符
泛型 泛型类 what: 类型参数化 why use: 1. 输出时候是object类型 而不是真正类型转化麻烦 import java.util.ArrayList; import java.util.List;public class ObjectExample {public static void main(String[] args) {List<Object> list new ArrayLi…...
文字转语音(三)FreeTTS实现
项目中有相关的功能,就简单研究了一下。 说明 FreeTTS 是一个基于 Java 的开源文本转语音(TTS)引擎,旨在将文字内容转换为自然语音输出。 FreeTTS 适合对 英文语音质量要求低、预算有限且需要离线运行 的场景,但若需…...
STM32 RTC 实时时钟说明
目录 背景 RTC(实时时钟)和后备寄存器 32.768HZ 如何产生1S定时 RTC配置程序 第一次上电RTC配置 第1步、启用备用寄存器外设时钟和PWR外设时钟 第2步、使能RTC和备份寄存器访问 第3步、备份寄存器初始化 第4步、开启LSE 第5步、等待LSE启动后稳定状态 第6步、配置LSE为…...
Open-R1 项目代码文件的详细剖析
目录 1. configs.py 功能概述 关键代码与细节 2. evaluate.py 功能概述 关键代码与细节 3. generate.py 功能概述 关键代码与细节 4. grpo.py 功能概述 关键代码与细节 5. rewards.py 功能概述 关键代码与细节 6. sft.py 功能概述 关键代码与细节 安装 训练…...
Android RenderEffect对Bitmap高斯模糊(毛玻璃),Kotlin(1)
Android RenderEffect对Bitmap高斯模糊(毛玻璃),Kotlin(1) import android.graphics.Bitmap import android.graphics.BitmapFactory import android.graphics.HardwareRenderer import android.graphics.PixelFormat import android.graphic…...
【DuodooBMS】基于Odoo的开源制造执行系统——以开源之力,驱动智能制造
以用户为中心的开放式智造平台 DuodooMES的设计始终围绕“用户可编程、生态可生长”的核心思想,打破传统工业软件的封闭性,让制造企业真正成为系统的“主人”: 1. 用户可编程:生产流程由你定义 界面可配置:无需代码即…...
机器视觉深度学习,工业缺陷检测中数据标注需要注意那些问题
在工业缺陷检测中,数据标注是构建高质量模型的关键步骤,需注意以下问题: 标注准确性 精确标注缺陷位置:确保标注框或掩码准确覆盖缺陷区域,避免过大或过小。 区分缺陷类型:不同缺陷应有明确分类,避免混淆。标注一致性 统一标注标准:制定并遵循统一的标注规范,确保不同…...
数据结构:图论入门
图论起源于欧拉对哥尼斯堡七桥问题的解决. 他构建的图模型将陆地用点来表示, 桥梁则用线表示, 如此一来, 该问题便转化为在图中能否不重复地遍历每条边的问题. 图论的应用 地图着色 在地图着色问题中, 我们用顶点代表国家, 将相邻国家之间用边相连. 这样, 问题就转化为用最少…...
【R语言】方差分析
一、基本术语 在R语言以及更广泛的统计学领域中,方差分析(ANOVA,即Analysis of Variance)是一种用于比较两个或更多组数据的均值是否存在显著差异的统计方法。可以使用aov()函数或其他相关函数(如anova())…...
区块链+隐私计算:长安链多方计算合约标准协议(CMMPC-1)发布
建设背景 长安链与隐私计算的深度融合是构建分布式数据与价值流通网络的关键基石,可以在有效连接多元参与主体的同时确保数据的分布式、可追溯、可计算,以及隐私性与安全性。在长安链与隐私计算的融合实践中,开源社区提炼并抽象出多方计算场…...
#渗透测试#批量漏洞挖掘#Crocus系统—Download 文件读取
免责声明 本教程仅为合法的教学目的而准备,严禁用于任何形式的违法犯罪活动及其他商业行为,在使用本教程前,您应确保该行为符合当地的法律法规,继续阅读即表示您需自行承担所有操作的后果,如有异议,请立即停…...
HAL库USART中断接收的相关问题
文章目录 一、使用中断的步骤二、相关函数分析1、HAL_UART_IRQHandler2、UART_Receive_IT3、HAL_UART_Receive_IT4、UART_Start_Receive_IT5、总结 三、HAL库使用心得 一、使用中断的步骤 1、配置GPIO 2、配置USART1 3、设置UART1中断优先级(不开启手动中断&#x…...
顺序表(C)
1.顺序表的概念 顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,通常借助数组来实现。它的特点是逻辑上相邻的元素在物理存储位置上也相邻,支持随机访问,可通过下标直接访问任意位置的元素。不过,顺序表在插入和…...
Polkadot-API (PAPI) 简介与使用指南
在 Polkadot 生态系统中,去中心化应用(dApp)、网页和钱包的开发者通常使用 JavaScript 和 TypeScript 进行开发。与基于 Polkadot SDK 的区块链进行交互,传统上主要依赖于 Polkadot JS 库。然而,最近波卡生态中出现了一…...
LabVIEW用户界面设计原则
在LabVIEW开发中,用户界面(UI)设计不仅仅是为了美观,它直接关系到用户的操作效率和体验。一个直观、简洁、易于使用的界面能够大大提升软件的可用性,尤其是在复杂的实验或工业应用中。设计良好的UI能够减少操作错误&am…...
Java中的synchronized:使用与锁升级机制
在Java并发编程中,synchronized关键字是实现线程同步的重要工具。它能够确保多个线程在访问共享资源时的线程安全性。随着Java版本的更新,synchronized的底层实现也在不断优化,尤其是引入了锁升级机制,显著提高了性能。本文将详细…...
简述MySQL主从复制原理及其工作过程,配置一主两从并验证
MySQL主从复制原理:MySQL主从复制是一种常用的数据同步技术,它通过将一个MySQL数据库服务器(主服务器)的数据实时复制到一个或多个从服务器,从而实现数据的备份、读写分离以及高可用性等目标. 基于binlog的主从同步 #主服务器配…...
MySQL8.0 innodb Cluster 高可用集群部署(MySQL、MySQL Shell、MySQL Router安装)
简介 MySQL InnoDB集群(Cluster)提供了一个集成的,本地的,HA解决方案。Mysq Innodb Cluster是利用组复制的 pxos 协议,保障数据一致性,组复制支持单主模式和多主模式。 InnoDB Cluster组件: …...
【时时三省】(C语言基础)简单的算法举例
山不在高,有仙则名。水不在深,有龙则灵。 ----CSDN 时时三省 判定2000—2500年中的每一年是否为闰年,并将结果输出。 本先分析闰年的条件: (1)能被4整除,但不能被100整除的年份都是闰年&…...
走进 Tcl 语言:历史、特性与应用
亲爱的小伙伴们😘,在求知的漫漫旅途中,若你对深度学习的奥秘、Java 与 Python 的奇妙世界,亦或是读研论文的撰写攻略有所探寻🧐,那不妨给我一个小小的关注吧🥰。我会精心筹备,在未来…...
Day42(补)【AI思考】-编译过程中语法分析及递归子程序分析法的系统性解析
文章目录 编译过程中语法分析及递归子程序分析法的系统性解析**一、总览:编译流程中的语法分析****1. 编译过程核心步骤** **二、语法分析的核心任务****1. 核心目标****2. 现实类比** **三、递归子程序分析法的本质****1. 方法分类****2. 递归子程序分析法的运作原…...
Effective Objective-C 2.0 读书笔记——内存管理(上)
Effective Objective-C 2.0 读书笔记——内存管理(上) 文章目录 Effective Objective-C 2.0 读书笔记——内存管理(上)引用计数属性存取方法中的内存管理autorelease保留环 ARCARC必须遵循的方法命名原则ARC 的自动优化࿱…...
软件测试覆盖率详解
🍅 点击文末小卡片 ,免费获取软件测试全套资料,资料在手,涨薪更快 一、覆盖率概念 覆盖率是用来度量测试完整性的一个手段,是测试技术有效性的一个度量。分为:白盒覆盖、灰盒覆盖和黑盒覆盖;测…...
控制玉米株高基因 PHR1 的基因克隆
https://zwxb.chinacrops.org/CN/10.3724/SP.J.1006.2024.33011...
windows10本地的JMeter+Influxdb+Grafana压测性能测试,【亲测,避坑】
一、环境,以下软件需要解压、安装到电脑上。 windows10 apache-jmeter-5.6.3 jdk-17.0.13 influxdb2-2.7.11 grafana-enterprise-11.5.1二、配置Influxdb,安装完默认连接http://localhost:8086/。打开连接,配置如下。 开启Influxdb…...
那些数据库函数那些事儿
stdio 1.基本概念 文件: 一组相关数据的集合 文件名: 01.sh //文件名 2.linux下的文件类型 b block 块设备文件 eg: 硬盘 c character 字符设备文件 eg: 鼠标,键盘 d directory 目录文件 eg: 文件夹 - regular 常…...
Excel中不用复杂公式根据指定X列的数值N复制整行数据N行简单方法
Excel中不用复杂公式根据指定X列的数值N复制整行数据N行简单方法 1、在“数据表”sheet1中对指定X列(假设X列的数字从X2开始到Xn结束)求和,和为Y。 2、在“数据表”sheet1数据列之外新建一列Z,Z1输入表头“匹配数据列”ÿ…...
如何在 Java 后端接口中提取请求头中的 Cookie 和 Token
个人名片 🎓作者简介:java领域优质创作者 🌐个人主页:码农阿豪 📞工作室:新空间代码工作室(提供各种软件服务) 💌个人邮箱:[2435024119qq.com] 📱个人微信&a…...
【Python网络爬虫】爬取网站图片实战
【Python网络爬虫】爬取网站图片实战 Scrapying Images on Website in Action By Jackson@ML *声明:本文简要介绍如何利用Python爬取网站数据图片,仅供学习交流。如涉及敏感图片或者违禁事项,请注意规避;笔者不承担相关责任。 1. 创建Python项目 1) 获取和安装最新版…...
SAP ABAP VA05增强
SE18 输入增强的BADI名称:BADI_SDOC_WRAPPER 进入后,点击Interface。 进入后,点击显示对象清单。 双击增强类,下面有之前做好的增强类,没有的可以自己创建一个。 IF_BADI_SDOC_WRAPPER~ADAPT_RESULT_COMP 代码 METHOD if_badi_sdoc_wrapper~adapt_result_comp."…...
