Java 基础进阶篇(十一)—— 泛型的定义与深入

news2024/11/15 17:57:21

文章目录

  • 一、泛型概述
  • 二、泛型的定义
    • 2.1 泛型类
    • 2.2 泛型方法
    • 2.3 泛型接口
  • 三、泛型深入
    • 3.1 泛型通配符
    • 3.2 泛型上下限
    • 3.3 案例:定义一个 “所有车量进行比赛” 的方法


一、泛型概述

泛型是 JDK5 中引入的特性,可以在编译阶段约束操作的数据类型,并进行检查。

格式:<数据类型>;

好处:统一数据类型。把运行时期的问题提前到了编译期间,避免了强制类型转换可能出现的异常,因为编译阶段类型就能确定下来。

注意:泛型只能支持引用数据类型。集合体系的全部接口和实现类都是支持泛型的使用的。


二、泛型的定义

泛型可以在很多地方进行定义:

  • 类后面 泛型类
  • 方法申明上 泛型方法
  • 接口后面 泛型接口

2.1 泛型类

定义类时同时定义了泛型的类就是泛型类。

格式:修饰符 class 类名<泛型变量> { ... }

作用:编译阶段可以指定数据类型,类似于集合的作用。

在这里插入图片描述
注:此处泛型变量 T 可以随便写为任意标识,常见的如E、T、K、V等。

public class MyArrayList<T> {
    private ArrayList<T> list = new ArrayList<>();
    
    public void add(T t){
        list.add(t);
    }
    public void remove(T t){
        list.remove(t);
    }
}

2.2 泛型方法

定义方法时同时定义了泛型的方法就是泛型方法。

格式:修饰符 <泛型变量> 方法返回值 方法名称(形参列表){...}

作用:方法中可以使用泛型接收一切实际类型的参数,方法更具备通用性。

在这里插入图片描述

public static <T> void printArray(T[] arr){
    if(arr != null){
        StringBuilder builder = new StringBuilder("[");
        for (int i = 0; i < arr.length; i++) {
            builder.append(arr[i]).append(i == arr.length - 1 ? "" : ", ");
        }
        builder.append("]");
        System.out.println(builder);
    }else {
        System.out.println(arr);
    }
}

2.3 泛型接口

使用了泛型定义的接口就是泛型接口。

格式:修饰符 interface 接口名称<泛型变量>{...}

作用:泛型接口可以约束实现类,泛型接口可以让实现类选择当前功能需要操作的数据类型。

在这里插入图片描述

原理:实现类可以在实现接口的时候传入自己操作的数据类型这样重写的方法都将是针对于该类型的操作。

案例:教务系统,提供一个接口可约束一定要完成数据(学生,老师)的增删改查操作。

public interface Data<E> {
    void add(E e);
    void delete(int id);
    void update(E e);
    E queryById(int id);
}
public class Student {
	...
}

public class StudentData implements Data<Student>{
    @Override
    public void add(Student student) {
    }

    @Override
    public void delete(int id) {
    }

    @Override
    public void update(Student student) {
    }

    @Override
    public Student queryById(int id) {
        return null;
    }
}

public class Teacher {
	...
}

public class TeacherData implements Data<Teacher>{
    @Override
    public void add(Teacher teacher) {
    }

    @Override
    public void delete(int id) {
    }

    @Override
    public void update(Teacher teacher) {
    }

    @Override
    public Teacher queryById(int id) {
        return null;
    }
}

三、泛型深入

3.1 泛型通配符

通配符:?,其可以在 使用泛型 的时候代表一切类型。

注:E T K V 是在 定义泛型 的时候使用的。


3.2 泛型上下限

泛型上限:? extends Car,? 必须是 Car 或者其子类。
泛型下限:? super Car,? 必须是 Car 或者其父类。


3.3 案例:定义一个 “所有车量进行比赛” 的方法

需求:定义一个 “所有车进行比赛” 的方法,该方法参数只可接收汽车类型的集合,其中汽车的父类和子类如下:

class Car{
}
class BENZ extends Car{
}
class BMW extends Car{
}

试想 1:如果参数为泛型方式,则任何类的集合都可作为参数,这是错误的。

public static void go(ArrayList<T> cars){

}

试想 2:如果设置参数为父类类型,也是会存在问题:虽然 BMW 和 BENZ 都继承了 Car 但是 ArrayList<BMW>、ArrayList<BENZ>、 ArrayList<Car>没有关系的。

public static void go(ArrayList<Car> cars){

}

因此,可采用“泛型上限” 的方式解决此问题。客户端模拟代码如下:

public class GenericDemo {
    public static void main(String[] args) {
        ArrayList<BMW> bmws = new ArrayList<>();
        bmws.add(new BMW());
        bmws.add(new BMW());
        bmws.add(new BMW());
        go(bmws);

        ArrayList<BENZ> benz = new ArrayList<>();
        benz.add(new BENZ());
        benz.add(new BENZ());
        benz.add(new BENZ());
        go(benz);
    }

    // 所有车比赛
    public static void go(ArrayList<? extends Car> cars){

    }
}

文章参考:Java入门基础视频教程,java零基础自学就选黑马程序员Java入门教程(含Java项目和Java真题)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/498358.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Illustrator如何绘制图形对象之实例演示?

文章目录 0.引言1.几何图形绘制樱花2.绘制一艘潜水艇3.调整透视网格 0.引言 因科研等多场景需要进行绘图处理&#xff0c;笔者对Illustrator进行了学习&#xff0c;本文通过《Illustrator CC2018基础与实战》及其配套素材结合网上相关资料进行学习笔记总结&#xff0c;本文对图…

【C++】 类基础汇总(类封装,构造、析构函数...)

目录 前言 正文 类封装 为什么要进行类封装 概念 访问修饰符 构造函数 概念 特点 析构函数 概念 特点 再谈面向过程与面向对象 面向过程 代码举例 面向对象 代码举例 结语 下期预告 前言 在学习过【C语言进阶C】 C基础--让你丝滑的从C语言进阶到C 之后&am…

Batch v.s. Stream Processing

当处理大数据时&#xff0c;通常使用批处理和流处理两种模型。它们的主要区别如下&#xff1a; 1.输入 批处理处理的是时间边界确定的数据&#xff0c;也就是输入数据有一个结尾。 流处理处理的是数据流&#xff0c;没有明确定义的边界。 2.实时性 批处理通常用于数据不需要实时…

2023最新水果DAW编曲软件fl studio 21.0.3.351中文版功能介绍/下载安装/语言切换/激活解锁教程

2023最新水果DAW编曲软件fl studio 21.0.3.351中文版功能介绍/下载安装/语言切换/激活解锁教程 是一款免费的音乐编曲制作软件&#xff0c;有了它你可以制作出色的音乐。它为您提供了一个集成的开发环境&#xff0c;使用起来非常简单有效&#xff0c;您的工作会变得更有条理。同…

2022年NOC大赛编程马拉松赛道python小高组试卷-正式卷,包含答案

2022NOC-Python决赛小高组A卷正式卷 单选题: 1、答案:D Python中关于自定义函数,下列说法正确的是? A、函值一定有返回值 B、函数一定有参数 C、函数内一定要定义变量 D、以上三种说法都不对 2、答案:A 下列说法错误的是? A、二维列表里的元素一定是一维列表 B…

VS2015下写Qt代码qDebug()函数不能看到调试信息

使用VS2015调试Qt代码发现不能很好的显示qDebug()的内容. 例如:我想显示 qDebug() << key << ": " << value.toString(); 这个代码中的值,想把他打印到控制台上.但是我写的是UI软件,并没有控制台显示.这时候就需要在exe的属性中设置一下.以我写…

[LeetCode周赛复盘] 第 344 场周赛20230507

[LeetCode周赛复盘] 第 344 场周赛20230507 一、本周周赛总结6416. 找出不同元素数目差数组1. 题目描述2. 思路分析3. 代码实现 6417. 频率跟踪器1. 题目描述2. 思路分析3. 代码实现 6418. 有相同颜色的相邻元素数目1. 题目描述2. 思路分析3. 代码实现 6419. 使二叉树所有路径…

MySQL_2 常见列类型与表的基本操作

目录 一、常见列类型&#xff08;字段类型&#xff09; 1.数值类型 : 1 整型 2 浮点型 2.文本类型&#xff08;字符串类型&#xff09; : 3.二进制类型 : 4.日期类型 : 二、表的基本操作 1.创建表 : 1 基本语法 2 代码演示 2.删除表 : 1 基本语法 2 代码演示 3.修改表…

收藏:不错的质量论述文:《研发效能系列 - 质量与速度能否兼得》

研发效能系列 - 质量与速度能否兼得丨IDCF 引言 我们的时间&#xff0c;应该是用于提高软件质量&#xff0c;还是专注在发布更有价值的功能&#xff1f;这貌似是软件研发中永恒的话题。 到底什么是质量&#xff1f; 质量有什么特质&#xff1f; 质量与速度是什么关系&#…

Actuators + jolokia

Actuators + jolokia Jolokia造成的XXE漏洞 首先我们查看我们当前环境http://x.x.x.x/jolokia/list地址,是否存在reloadByURL这个方法, 这个方法是造成RCE的关键。因为logback组件提供的reloadByURL操作使我们可以从外部URL重新加载日志配置 创建logback.xml和file.dtd文件…

为何要使用MySQL?MySQL和Oracle的区别有什么?

目录 一、为何要使用MySQL&#xff1f;二、MySQL学习路线三、数据库相关概念1、DB&#xff0c;数据库Database。2、DBMS&#xff0c;数据库管理系统Database Management System。3、SQL&#xff0c;结构化查询语言&#xff0c;Structured Query Language。 四、常见的关系型数据…

SpringCloud_Config配置中心和Bus消息总线和Stream消息驱动

文章目录 一、SpringCloudConfig配置中心1、SpringCloudConfig配置中心的概论2、SpringCloudConfig配置中心的gitee仓库搭建3、SpringCloudConfig配置中心服务端的搭建4、SpringCloudConfig配置中心客户端的的搭建5、SpringCloudConfig配置中心客户端动态刷新配置文件 二、Spri…

如何用ChatGPT做品牌联名方案策划?

该场景对应的关键词库&#xff08;15个&#xff09;&#xff1a; 品牌、个人IP、社交话题、联名策划方案、调研分析、市场影响力、资源互补性、产品体验、传播话题、视觉形象设计、合作职权分配、销售转化、曝光目标、宣发渠道、品牌形象 提问模板&#xff08;1个&#xff09;…

Milvus应用开发实战【语义搜索】

美国总统竞选活动即将到来。 现在是回顾拜登政府上任头两年的一些演讲的好时机。 搜索一些演讲记录以了解更多关于白宫迄今为止关于某些主题的信息不是很好吗&#xff1f; 假设我们要搜索演讲的内容。 我们该怎么做&#xff1f; 我们可以使用语义搜索。 语义搜索是目前人工智能…

【谷粒商城之分布式锁Redisson-lock】

本笔记内容为尚硅谷谷粒商城分布式锁Redisson-lock部分 目录 一、分布式锁与本地锁 二、分布式锁实现 使用 RedisTemplate 操作分布式锁 三、Redisson 完成分布式锁 1、简介 2、导入依赖 3、配置 4、使用 1.可重入锁 2.公平锁&#xff08;Fair Lock&#xff09; 3…

记录-VUE中常用的4种高级方法

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 1. provide/inject provide/inject 是 Vue.js 中用于跨组件传递数据的一种高级技术&#xff0c;它可以将数据注入到一个组件中&#xff0c;然后让它的所有子孙组件都可以访问到这个数据。通常情况下&a…

DC-8通关详解

信息收集 漏洞发现 找个扫描器扫一下 msf试了几个exp都没用 那么手动找找 发现传参nid出存在sql注入 python sqlmap -u "http://192.168.45.144:80/?nid1" --union-cols1 -D d7db -T users -C name,pass --columns --tables --dump 用john爆密码 admin爆了20分钟没…

为Linux系统添加一块新硬盘,并扩展根目录容量

我的原来ubuntu20.04系统装的时候不是LVM格式的分区&#xff0c; 所以先将新硬盘转成LVM&#xff0c;再将原来的系统dd到新硬盘&#xff0c;从新硬盘的分区启动&#xff0c;之后再将原来的分区转成LVM&#xff0c;在融入进来 1&#xff1a;将新硬盘制作成 LVM分区 我的新硬盘…

Python进阶

1.Json数据格式&#xff08;用于不同语言的数据交互&#xff09; 特定格式的字符串 第一种形式的Json &#xff0c;转换成字典 第二种形式的Json&#xff0c;转换成字典列表 1.1 Python的Json转化 dumps 方法 Python转Json loads 方法 Json转Python 1.2 字典转json 需要…

Studio One6Mac中文免费版数字音乐工作站DAW

无论你是第一次接触数字音乐工作站&#xff08;DAW&#xff09;&#xff0c;还是第一次尝试 制作属于自己的音乐&#xff0c;Studio One 都能给你非凡的体验&#xff01;Studio One 6中文版是一款音乐制作软件&#xff0c;通过新的智能模板、直观的拖放工作流、可定制的用户界面…