Java 基础进阶篇(十一)—— 泛型与可变参数

news2024/10/6 18:32:48

文章目录

  • 一、泛型概述
  • 二、泛型的定义
    • 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){

    }
}

四、可变参数

可变参数用在形参中可以接收多个数据。

格式:数据类型...参数名称

作用:接收参数非常灵活方便。可以不接收参数,可以接收一个或者多个参数,也可以接收一个数组。

可变参数在方法内部本质上就是一个数组

注意:一个形参列表中可变参数只能有一个;可变参数必须放在形参列表的最后面

举例:假如需要定义一个方法求和,求和数字个数不确定。

public static void main(String[] args) {
	System.out.println(getAll()); // 0
	System.out.println(getAll(10)); // 10
	System.out.println(getAll(10, 20, 30)); // 60
	System.out.println(getAll(new int[]{10, 20, 30, 40, 50})); // 150
}

/**
  注意:一个形参列表中只能有一个可变参数,可变参数必须放在形参列表的最后面
  */
public static int getAll(int... nums){
	int co = 0;
	for (int i = 0; i < nums.length; i++) {
		co += nums[i];
	}
	return co;
}

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

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

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

相关文章

从源码全面解析Java 线程池的来龙去脉

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱敲代码的小黄&#xff0c;独角兽企业的Java开发工程师&#xff0c;CSDN博客专家&#xff0c;阿里云专家博主&#x1f4d5;系列专栏&#xff1a;Java设计模式、Spring源码系列、Netty源码系列、Kafka源码系列、JUC源码…

二叉树专题

⭐️前言⭐️ 本文主要总结一些常见的二叉树题目&#xff0c;希望读者能够通过这篇文章&#xff0c;来对二叉树有一个更深一步的了解。 &#x1f349;欢迎点赞 &#x1f44d; 收藏 ⭐留言评论 &#x1f4dd;私信必回哟&#x1f601; &#x1f349;博主将持续更新学习记录收获&…

【移动端网页布局】flex 弹性布局 ⑥ ( 设置侧轴多行子元素排列方式 | align-content 样式说明 | 代码示例 )

文章目录 一、设置侧轴多行子元素排列方式 : align-content 样式说明1、align-content 样式引入2、align-content 样式属性值 二、代码示例1、代码示例 - 侧轴多行元素从上到下排列2、代码示例 - 侧轴多行元素垂直居中3、代码示例 - 侧轴多行元素平分剩余空间4、代码示例 - 侧轴…

1960-2014年各国二氧化碳排放量(人均公吨数)

1960&#xff0d;2014年各国二氧化碳排放量&#xff08;人均公吨数&#xff09;&#xff08;世界发展指标, 2019年12月更新&#xff09; 1、来源&#xff1a;世界发展指标 2、时间&#xff1a;1960&#xff0d;2014年 3、范围&#xff1a;世界各国 4、指标&#xff1a; 二氧…

C++ STL:set和map的结构及接口使用

目录 一. set和map的简介 1.1 set的简介 1.2 map的简介 二. set的主要接口函数及使用方法 2.1 构造及赋值相关接口函数 2.2 通过迭代器遍历set 2.3 结构修改相关接口函数 2.4 其他主要接口函数 三. map的主要接口函数及使用方法 3.1 构造和赋值相关接口函数 3.2 通…

Midjourney放大招,什么好看唯美高清,统统都是我的

你知道吗&#xff1f;超过99%的人都没有足够出色的肖像照来展现自己的魅力&#xff0c;除非你是那种在网上拥有成千上万张自己肖像照的大明星。但是&#xff0c;好消息来了&#xff01;现在有一个InsightFaceSwap Discord bot&#xff0c;可以帮助你实现这个“不可能完成”的想…

【JavaEE初阶】多线程进阶(五)常见锁策略 CAS synchronized优化原理

文章目录 常见锁策略乐观锁 & 悲观锁轻量级锁 & 重量级锁自旋锁 & 挂起等待锁互斥锁 & 读写锁公平锁 & 非公平锁可重入锁 & 不可重入锁synchronized对应以上的锁策略锁策略中的面试题&#xff1a; CASCAS的介绍CAS如何实现CAS的应用场景CAS的典型问题&…

Excel公式:将日期转换为月份年

Excel公式&#xff1a;将日期转换为月份年 在Excel中&#xff0c;您可以将日期单元格格式化为多种类型的日期格式&#xff0c;但是在某些情况下&#xff0c;您希望将日期转换为文本格式&#xff0c;仅转换为月&#xff0c;年&#xff0c;日或月年&#xff0c;日月或年日。 在本…

Java全栈学习路线总结,科班程序员搬砖逆袭

&#x1f307;文章目录 前言一、前置知识二、 Web前端基础示例&#xff1a;1.文本域2.密码字段 三、后端基础一. Java基础二. 数据库技术三. Web开发技术四. 框架技术五. 服务器部署 四、其他技术五、全栈开发六、综合实践七、学习教程一、前端开发二、后端开发三、数据库开发四…

VUE 学习笔记(三) Vue 渲染流程详解

在 Vue 里渲染一块内容&#xff0c;会有以下步骤及流程&#xff1a; 第一步&#xff0c;解析语法&#xff0c;生成AST 第二步&#xff0c;根据AST结果&#xff0c;完成data数据初始化 第三步&#xff0c;根据AST结果和DATA数据绑定情况&#xff0c;生成虚拟DOM 第四步&…

ESP32设备驱动-Si1145红外接近-紫外 (UV) 指数和环境光传感器驱动

Si1145红外接近-紫外 (UV) 指数和环境光传感器驱动 文章目录 Si1145红外接近-紫外 (UV) 指数和环境光传感器驱动1、Si1145介绍2、硬件准备3、软件准备4、驱动实现1、Si1145介绍 Si1145/46/47 是一款低功耗、基于反射的红外接近、紫外 (UV) 指数和环境光传感器,具有 I2C 数字接…

电脑百度网盘打不开怎么办 电脑百度网盘双击没反应处理方法

有时候我们想要在电脑浏览器上下载一些文件时&#xff0c;打开的文件下载链接有些需要通过百度网盘来存储下载&#xff0c;然而当用户在电脑中安装完百度网盘工具之后&#xff0c;双击想要打开时却总是没反应&#xff0c;对此电脑百度网盘打不开怎么办呢&#xff1f;接下来小编…

Java反射和动态代理

反射 反射允许对封装类的成员变量、成员方法和构造方法的信息进行编程访问 成员变量&#xff1a;修饰符、名字、类型、get/set值 构造方法&#xff1a;修饰符、名字、形参、创建对象 成员方法&#xff1a;修饰符、名字、形参、返回值、抛出的异常、获取注解、运行方法 获取…

【云原生进阶之PaaS中间件】第一章Redis-1.1简介

1 Redis概述 1.1 Redis 简介 Redis&#xff08;Remote Dictionary Server )&#xff0c;即远程字典服务&#xff0c;是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库&#xff0c;并提供多种语言的API&#xff0c;可用作数据库&#…

高质量毕业答辩PPT模板+PPT网站

文章目录 前言一、iSlide二、office plus三、优品PPT总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 又是一年毕业季&#xff0c;又到了快要答辩的时候&#xff0c;最近有一些小伙伴找我要毕业答辩PPT模板&#xff0c;本着这不能拒绝啊的心态&…

20230507使用python3批量转换DOCX文档为TXT

20230507使用python3批量转换DOCX文档为TXT 2023/5/7 20:22 WIN10使用python3.11 # – coding: gbk – import os from pdf2docx import Converter from win32com import client as wc """这里需要安转包pywin32com""" # 读取pdf文件文本内容 …

探秘二分查找中的数学奇迹:如何手动求解整数x的平方根

本篇博客会讲解力扣“69. x 的平方根”这道题的解题思路。这是题目链接。 大家先来审下题&#xff1a; 以及示例&#xff1a; 还有提示&#xff1a; 本题常规的思路有&#xff1a;暴力查找、转换成指数和对数、二分查找、牛顿迭代。 转换成指数和对数的方法非常简单&#…

接口自动化测试框架9项必备功能有哪些?你一定不知道

当你准备使用一个接口测试框架或者自造轮子的时候&#xff0c;或许你需要先了解下一个接口自动化测试框架必须具备什么功能。 一、校验   这个很好了解&#xff0c;如果没有校验&#xff0c;单纯的执行接口的话&#xff0c;那就谈不上测试了。所以支持对返回值校验是一个必须…

[Golang] 爬虫实战-获取动态页面数据-获取校招信息

&#x1f61a;一个不甘平凡的普通人&#xff0c;致力于为Golang社区和算法学习做出贡献&#xff0c;期待您的关注和认可&#xff0c;陪您一起学习打卡&#xff01;&#xff01;&#xff01;&#x1f618;&#x1f618;&#x1f618; &#x1f917;专栏&#xff1a;算法学习 &am…

Solr(1):Solr概述

1 概述 Solr 是一个基于 Apache Lucene 之上的搜索服务器&#xff0c;它是一个开源的、基于 Java 的信息检索库。它旨在驱动功能强大的文档检索应用程序 - 无论您需要根据用户的查询将数据服务到何处&#xff0c;Solr 都可以为您服务。Solr与应用程序的集成以为您服务。 下面…