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

【java学习—十一】泛型(1)

文章目录

  • 1. 为什么要有泛型Generic
  • 2. 泛型怎么用
    • 2.1. 泛型类
    • 2.2. 泛型接口
    • 2.3. 泛型方法
  • 3. 泛型通配符
    • 3.1. 通配符
    • 3.2. 有限制的通配符


1. 为什么要有泛型Generic

在这里插入图片描述

    泛型,JDK1.5新加入的,解决数据类型的安全性问题,其主要原理是在类声明时通过一个标识表示类中某个属性的类型或者是某个方法的返回值及参数类型。这样在类声明或实例化时只要指定好需要的具体的类型即可。
    Java泛型可以保证如果程序在编译时没有发出警告,运行时就不会产生ClassCastException异常。同时,代码更加简洁、健壮。

举例:

package day11;import java.util.ArrayList;
import java.util.List;public class Test {public static void main(String[] args) {List list = new ArrayList<>();//不指定泛型,可以向list集合中添加各种类型元素list.add(111);list.add("sss");list.add(true);//需求,只能在集合中存字符串List<String> l = new ArrayList<String>();l.add("xx");
//		l.add(111);//指定的String类型,不可以添加String以外的元素类型}}

    Java中的泛型,只在编译阶段有效。在编译过程中,正确检验泛型结果后,会将泛型的相关信息擦除,并且在对象进入和离开方法的边界处添加类型检查和类型转换的方法。也就是说,泛型信息不会进入到运行时阶段
    解释:
    视频中老师说:比如上段代码中最后一行的l.add(111)在编译期间就会报错,只有删除这一行,或者将里面的数据改成String类型后,才可以通过编译。

2. 泛型怎么用

2.1. 泛型类

对象实例化时不指定泛型,默认为: Object 。
泛型不同的引用不能相互赋值。

package day11;import java.util.ArrayList;
import java.util.List;public class Test {public static void main(String[] args) {A<String> a1 = new A<String>();//在new A的对象的时候,指定泛型的类型Stringa1.setKey("xxxx");//对象使用setKey(T key)方法,中的key形参就是StringSystem.out.println(a1.getKey());//T getKey(),返回值就有new对象确定返回值是StringA<Integer> a2 = new A<Integer>();a2.setKey(1);Integer i = a2.getKey();A a3 = new A();//不指定泛型,相当于指定了一个Object类型//A<Object> a3 = new A<Object>();//等同于上行代码a3.setKey(new Object());Object obj = a3.getKey();//同样的类,但是在new对象时指定不同的数据类型,那么这些对象不能互相赋值a1 = a2;//错误,不同的数据类型不能互相赋值}}/*** 此处的泛型‘T’可以任意的取名,即可换成A,B,C等* 一般使用T,译为type* @author 14532** @param <T>*/
class A<T>{//< >中的内容可以任何取名,按惯例是Tprivate T key;public void setKey(T key) {this.key = key;}public T getKey() {return this.key;}
}

2.2. 泛型接口

定义一个泛型接口:

interface Generator<T> {
    T next();
}

①未传入泛型实参时,与泛型类的定义相同,在声明类的时候,需将泛型的声明也一起加到类中
②如果实现接口时,指定接口的泛型的具体数据类型,这个类实现接口所有方法的位置都要替换实际的具体数据类型

举例:

package day11;public class Test1 {public static void main(String[] args) {B1<Object> b1 = new B1<Object>();B1<String> b11 = new B1<String>();B2 b2 = new B2();//不用指定泛型,指定泛型反而会报错}
}interface IB<T>{T test(T t);
}/*** 未传入泛型实参时,与泛型类的定义相同,在声明类的时候,需将泛型的声明也一起加到类中* @author 14532** @param <T>*/
class B1<T> implements IB<T>{//B1<T>:未传入实参,将泛型的声明<T>也一起加到类中@Overridepublic T test(T t) {return t;}
}/*** 如果实现接口时指定接口的泛型的具体数据类型* 这个类实现接口所有方法的位置都要替换实际的具体数据类型* @author 14532**/
class B2 implements IB<String>{@Overridepublic String test(String t) {return null;}
}

2.3. 泛型方法

    方法,也可以被泛型化,不管此时定义在其中的类是不是泛型化的。在泛型方法中可以定义泛型参数,此时,参数的类型就是传入数据的类型。

泛型方法的格式:

public class DAO {
    public <E> void show(E e){
        System.out.println(e.toString());
    }
    public <T> T show1(T t){
        return t;
    }
}

举例:

class Cc{/*** 无返回值的泛型方法* @param <T>* @param s*/public <T> void test(T s) {T t = s;}/*** 有返回值的泛型方法* @param <T>* @param s* @return*/public <T> T test1(T s) {return s;}/*** 形参为可变参数的泛型方法* @param <T>* @param strs*/public <T> void test2(T... strs) {for(T s : strs) {System.out.println(s);}}}

举例2:

package day11;public class Test1 {public static void main(String[] args) {Cc<Object> c = new Cc<Object>();c.test("xxx");//泛型方法在调用之前没有固定的数据类型//在调用时,传入的参数是什么类型,就会把泛型改成什么类型//也就是说,泛型方法会在调用时确定泛型的具体数据类型Integer i = c.test1(2);//传递的参数是Integer,泛型就固定成Integer,返回值就是IntegerBoolean b = c.test1(true);//传递的参数是Boolean,泛型就固定成Boolean,返回值就是Boolean}
}class Cc<E>{private E e;//	public static void test3() {
//		//在静态方法中不能使用类定义的泛型,如果要使用泛型,只能使用静态方法自己定义的泛型
//		//System.out.println(this.e);
//	}/*** 静态方法的泛型方法* @param <T>* @param t*/public static <T> void test3(T t) {//在静态方法中不能使用类定义的泛型,如果要使用泛型,只能使用静态方法自己定义的泛型System.out.println(t);}/*** 无返回值的泛型方法* @param <T>* @param s*/public <T> void test(T s) {//在类上定义的泛型,可以在普通的方法中使用System.out.println(this.e);T t = s;}/*** 有返回值的泛型方法* @param <T>* @param s* @return*/public <T> T test1(T s) {return s;}/*** 形参为可变参数的泛型方法* @param <T>* @param strs*/public <T> void test2(T... strs) {for(T s : strs) {System.out.println(s);}}}

3. 泛型通配符

3.1. 通配符

不确定集合中的元素具体的数据类型,使用"?"表示所有类型
如:

	public void test(List<?> list){System.out.println(list);}

举例:

package day11;import java.util.ArrayList;
import java.util.List;public class Test2 {public static void main(String[] args) {Dd d = new Dd();List<String> l1 = new ArrayList<String>();//?:可以代表各种类型,如String、Integerd.test(l1);List<Integer> l2 = new ArrayList<Integer>();d.test(l2);}}class Dd {public void test(List<?> list) {//test方法需要一个list集合的参数,不确定list集合中到底是存的数据的类型是什么}
}

3.2. 有限制的通配符

举例:

<? extends Person> (无穷小, Person)
只允许泛型为Person及Person父类的引用调用

<? super Person> [Person, 无穷大]
只允许泛型为Person及Person父类的引用调用

<? extends Comparable>
只允许泛型为实现Comparable接口的实现类的引用调用

举例:

package day11;import java.util.ArrayList;
import java.util.List;public class Test2 {public static void main(String[] args) {Dd d = new Dd();//list参数的元素数据类型是CC1及其子类List<CC1> lc = new ArrayList<CC1>();d.test1(lc);List<DD1> ld = new ArrayList<DD1>();d.test1(ld);//		List<BB1> lb = new ArrayList<BB1>(); //BB1不是CC1的子类
//		d.test1(lb);//list参数的元素数据类型是CC1及其父类 d.test2(lc);List<BB1> lb = new ArrayList<BB1>();d.test2(lb);List<AA1> la = new ArrayList<AA1>();d.test2(la);//		d.test2(ld);//DD1不是CC1的父类//list参数的元素数据类型是IA的实现类List<IAImpl> lia = new ArrayList<IAImpl>();d.test3(lia);//		d.test3(la);//AA1不是IA的实现类}
}class Dd {public void test(List<?> list) {//test方法需要一个list集合的参数,不确定list集合中到底是存的数据的类型是什么}public void test1(List<? extends CC1> list) {//list参数的元素数据类型是CC1及其子类}public void test2(List<? super CC1> lsit) {//参数的元素数据类型是CC1及其父类 }public void test3(List<? extends IA> lsit) {//list参数的元素数据类型是IA的实现类}
}class AA1{}class BB1 extends AA1{}class CC1 extends BB1{}class DD1 extends CC1{}interface IA{}class IAImpl implements IA{}

相关文章:

【java学习—十一】泛型(1)

文章目录 1. 为什么要有泛型Generic2. 泛型怎么用2.1. 泛型类2.2. 泛型接口2.3. 泛型方法 3. 泛型通配符3.1. 通配符3.2. 有限制的通配符 1. 为什么要有泛型Generic 泛型&#xff0c;JDK1.5新加入的&#xff0c;解决数据类型的安全性问题&#xff0c;其主要原理是在类声明时通过…...

CN考研真题知识点二轮归纳(4)

持续更新&#xff0c;上期目录&#xff1a; CN考研真题知识点二轮归纳&#xff08;4&#xff09;https://blog.csdn.net/jsl123x/article/details/134135134?spm1001.2014.3001.5501 1.既可以扩展网段又是二层的设备 网段一般指一个计算机网络中使用同一物理层设备&#xff…...

ROS学习笔记(4):ROS架构和通讯机制

前提 前4篇文章以及帮助大家快速入门ROS了&#xff0c;而从第5篇开始我们会更加注重知识积累。同时我强烈建议配合B站大学的视频一起服用。 1.ROS架构三层次&#xff1a; 1.基于Linux系统的OS层&#xff1b; 2.实现ROS核心通信机制以及众多机器人开发库的中间层&#xff1b…...

深度新闻稿件怎么写?新闻稿怎么写得有深度?

深度新闻稿件&#xff0c;顾名思义&#xff0c;是对新闻事件进行深入挖掘和分析的稿件。它不仅仅是对事件的简单报道&#xff0c;更注重对事件背后的社会现象、原因、影响等方面进行深度剖析&#xff0c;从而使读者能够全面、深入地了解事件。这种稿件要求作者具备较高的新闻敏…...

百度智能云千帆大模型平台黑客马拉松报名开启!

比赛简介 创造是生成式 AI 的核心。无论是智能导购带来的线上购物体验升级&#xff0c;还是主图生成带来的素材生产效率提升&#xff0c;又或是游戏场景的快速设置、智能 NPC 的全新交互、数字广告的精准推荐和个性化定制&#xff0c;亦或者是为学生提供更符合真实的口语练习环…...

数据库 | 看这一篇就够了!最全MySQL数据库知识框架!

大家好&#xff01; 作为一名程序员&#xff0c;每天和各种各样的“数据库”打交道&#xff0c;已经成为我们的日常。当然&#xff0c;立志成为一名超级架构师的我&#xff0c;肯定要精通这项技能。咳咳&#xff01;不过饭还是要一口一口吃的&#xff0c;“数据库”这个内容实在…...

Android 控件背景实现发光效果

主要实现的那种光晕效果&#xff1a;中间亮&#xff0c;四周逐渐变淡的。 这边有三种发光效果&#xff0c;先上效果图。 第一种、圆形发光体 实现代码&#xff1a;新建shape_light.xml&#xff0c;导入以下代码。使用时&#xff0c;直接给view设置为background。 <?xml …...

安全狗亮相厦门市工信领域数据安全宣贯培训会

10月31日&#xff0c;厦门市工业和信息化局&#xff08;市大数据管理局&#xff09;顺利举办厦门市工信领域数据安全宣贯培训。 作为国内云原生安全领导厂商&#xff0c;安全狗以厦门市工业领域数据安全管理支撑单位身份受邀出席此次会议。 据悉&#xff0c;此次活动旨在贯彻…...

最长回文子串

问题 给你一个字符串 s&#xff0c;找到 s 中最长的回文子串。 如果字符串的反序与原始字符串相同&#xff0c;则该字符串称为回文字符串。 示例 1&#xff1a; 输入&#xff1a;s "babad" 输出&#xff1a;"bab" 解释&#xff1a;"aba" 同…...

从瀑布模式到水母模式:ChatGPT引领软件研发的革新之路

ChatGPT引领软件研发的革新之路 概述操作建议本书优势 内容简介作者简介专家推荐读者对象目录直播预告写在末尾&#xff1a; 主页传送门&#xff1a;&#x1f4c0; 传送 概述 计算机技术的发展和互联网的普及&#xff0c;使信息处理和传输变得更加高效&#xff0c;极大地改变了…...

一种使用wireshark快速分析抓包文件amr音频流的思路方法

解决方案&#xff1a; 1. 使用wireshark过滤amr,并导出原始数据文件&#xff1b; 2.使用ue的二进制编辑模式&#xff0c;编辑该文件&#xff0c;添加amr头&#xff0c;6个字节数据“#!AMR”&#xff0c;字节数据为 23 21 41 4D 52 0A 3.修正格式&#xff1a;通过抓包发现&#…...

银河麒麟x86版、银河麒麟arm版操作系统编译zlmediakit

脚本 # 安装依赖 gcc-c.x86_64 这个不加的话会有问题 sudo yum -y install gcc gcc-c libssl-dev libsdl-dev libavcodec-dev libavutil-dev ffmpeg git openssl-devel gcc-c.x86_64mkdir -p /home/zenglg cd /home/zenglg git clone --depth 1 https://gitee.com/xia-chu…...

InnoDB - 双写机制

双写机制用于提高数据持久性和可靠性。 双写机制的核心思想是&#xff0c;将写操作先写入一个临时缓冲区&#xff0c;然后再写入实际的数据文件。这个临时缓冲区通常是固定大小的内存缓冲区&#xff0c;称为双写缓冲。这个机制的主要目的是避免数据文件在写入时出现损坏或数据…...

【蓝桥杯选拔赛真题08】C++最大值最小值平均值 青少年组蓝桥杯C++选拔赛真题 STEMA比赛真题解析

目录 C/C++最大值最小值平均值 一、题目要求 1、编程实现 2、输入输出 二、算法分析</...

软考高级系统架构设计师系列之:系统开发基础知识、项目管理、信息安全和网络安全、计算机网络章节选择题详解

软考高级系统架构设计师系列之:系统开发基础知识、项目管理、信息安全和网络安全、计算机网络章节选择题详解 一、产品配置二、需求管理三、需求跟踪四、软件生命周期五、RUP六、耦合与内聚七、软件文档八、软件需求九、软件活动十、项目时间管理十一、需求管理十二、项目范围…...

0基础学习PyFlink——时间滑动窗口(Sliding Time Windows)

在《0基础学习PyFlink——时间滚动窗口(Tumbling Time Windows)》我们介绍了不会有重复数据的时间滚动窗口。本节我们将介绍存在重复计算数据的时间滑动窗口。 关于滑动窗口&#xff0c;可以先看下《0基础学习PyFlink——个数滑动窗口&#xff08;Sliding Count Windows&#x…...

API安全之《大话:API的前世今生》

写在前面&#xff1a;本文结合API使用的业界现状&#xff0c;系统性地阐述API的基本概念、发展历史、表现形式等基础内容&#xff0c;主要包含以下内容&#xff1a; 1.什么是API 2.API的发展历史 3.现代API常用消息格式 4.top N 互联网企业API 使用现状 当前的世界是一个信…...

H5或者Vue实现二维码识别

前言 1、扫码识别库采用开源的zxing/library 2、支持js&#xff0c;Vue&#xff0c;lit等实现 原文章地址和代码仓库地址 1、在界面创建video标签用来显示摄像头内容 <!-- 视区 --><!-- lit写法 --> <video ${ref(this.videoRef)} class"xy-scan-wrap…...

stm32整理(三)ADC

1 ADC简介 1.1 ADC 简介 12 位 ADC 是逐次趋近型模数转换器。它具有多达 19 个复用通道&#xff0c;可测量来自 16 个外部 源、两个内部源和 VBAT 通道的信号。这些通道的 A/D 转换可在单次、连续、扫描或不连续 采样模式下进行。ADC 的结果存储在一个左对齐或右对齐的 16 位…...

Redis-持久化+主从架构

文章目录 Redis的持久化RDB模式异步持久化的实现AOF模式总结 Redis的主从架构1.端口以及文件调试测试2.主从配置3.数据同步原理&#xff08;第一次同步为全局同步&#xff09;4.增量同步5.主从配置优化6.问:master主机怎么判断从机slave是不是第一次同步数据&#xff1f; Redis…...

可靠性+灵活性:电力载波技术在楼宇自控中的核心价值

可靠性灵活性&#xff1a;电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中&#xff0c;电力载波技术&#xff08;PLC&#xff09;凭借其独特的优势&#xff0c;正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据&#xff0c;无需额外布…...

测试markdown--肇兴

day1&#xff1a; 1、去程&#xff1a;7:04 --11:32高铁 高铁右转上售票大厅2楼&#xff0c;穿过候车厅下一楼&#xff0c;上大巴车 &#xffe5;10/人 **2、到达&#xff1a;**12点多到达寨子&#xff0c;买门票&#xff0c;美团/抖音&#xff1a;&#xffe5;78人 3、中饭&a…...

如何在看板中有效管理突发紧急任务

在看板中有效管理突发紧急任务需要&#xff1a;设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP&#xff08;Work-in-Progress&#xff09;弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中&#xff0c;设立专门的紧急任务通道尤为重要&#xff0c;这能…...

Linux云原生安全:零信任架构与机密计算

Linux云原生安全&#xff1a;零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言&#xff1a;云原生安全的范式革命 随着云原生技术的普及&#xff0c;安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测&#xff0c;到2025年&#xff0c;零信任架构将成为超…...

ardupilot 开发环境eclipse 中import 缺少C++

目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...

C++ 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

【JavaSE】绘图与事件入门学习笔记

-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角&#xff0c;以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向&#xff0c;距离坐标原点x个像素;第二个是y坐标&#xff0c;表示当前位置为垂直方向&#xff0c;距离坐标原点y个像素。 坐标体系-像素 …...

安卓基础(aar)

重新设置java21的环境&#xff0c;临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的&#xff1a; MyApp/ ├── app/ …...

【Go语言基础【12】】指针:声明、取地址、解引用

文章目录 零、概述&#xff1a;指针 vs. 引用&#xff08;类比其他语言&#xff09;一、指针基础概念二、指针声明与初始化三、指针操作符1. &&#xff1a;取地址&#xff08;拿到内存地址&#xff09;2. *&#xff1a;解引用&#xff08;拿到值&#xff09; 四、空指针&am…...

Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)

引言 在人工智能飞速发展的今天&#xff0c;大语言模型&#xff08;Large Language Models, LLMs&#xff09;已成为技术领域的焦点。从智能写作到代码生成&#xff0c;LLM 的应用场景不断扩展&#xff0c;深刻改变了我们的工作和生活方式。然而&#xff0c;理解这些模型的内部…...