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

【Java 基础】16 泛型

文章目录

    • 什么是泛型?
    • 泛型的声明
    • 泛型的使用
    • 泛型方法
    • 通配符和泛型上下界
      • 1)通配符
      • 2)泛型上下界
    • 泛型的好处
    • 注意事项

泛型提供了一种在编写代码时更好地 支持类型安全的机制。通过泛型,我们可以编写更加 通用灵活可读性高的代码,同时 减少类型转换和运行时错误

什么是泛型?

泛型(Generics)是一种参数化类型的概念

它使得我们可以编写能够适用于多种类型的代码,而不是为每种类型都写一份代码。泛型提供了编译时的类型检查,使得代码更加安全,并且减少了在运行时进行频繁的类型转换

例如:

我们之前有为很多箱子都贴上了固定的标签!

装 苹果,老鼠,小狗,因为不能放一起呀!虽然,狗现在已经不多管闲事去拿耗子啦_

有多少种类就需要多少箱子,新增加一个就需要再增加,就很麻烦

于是我们想到了,箱子不贴固定的名称,来一种就装一种,这样就不需要为每一种单独定义一个标签啦
在这里插入图片描述

之前的 苹果,老鼠,小狗等等箱子,就是具体的类型。而后来的 东西,就是一个泛型。

泛型的声明

在 Java 中,泛型主要通过在接口方法中使用泛型类型参数来实现。

下面就使用泛型去定义一个箱子

// 定义一个泛型类(比如这就是一个装东西的箱子)
class Box<T> {private T value;public void setValue(T value) {this.value = value;}public T getValue() {return value;}
}

上述代码中,Box 类使用了泛型类型参数 T,使得这个类可以存储和返回任意类型的数据。

泛型的使用

使用上面已经定义好的箱子去装各种各样的东西

先往里装一种类型的东西,如老鼠

    public static void main(String[] args) {// 可以往箱子里装 int 型数字(比如这就是老鼠)Box<Integer> integerBox = new Box<>();integerBox.setValue(42);int intValue = integerBox.getValue();System.out.println(intValue);}

输出结果:42

再往里装另一种类型的东西,如小狗

    public static void main(String[] args) {// 还可以往箱子里装 String 型的字符(比如这就是小狗)Box<String> stringBox = new Box<>();stringBox.setValue("哈士奇");String stringValue = stringBox.getValue();System.out.println(stringValue);}

输出结果:哈士奇

泛型方法

除了泛型类,Java 还支持泛型方法。泛型方法可以在普通类中定义,也可以在泛型类中定义。

以下是一个简单的泛型方法的例子:

// 定义一个泛型方法
public static <E> void printBoxSaveWhat(E e) {System.out.println("箱子里装的是: " + e);
}
// 使用泛型方法
public static void main(String[] args) {// 打印第一种类型printBoxSaveWhat(42);// 打印外一种类型printBoxSaveWhat("哈士奇");
}

输出结果:

箱子里装的是: 42
箱子里装的是: 哈士奇

上述代码中,printBoxSaveWhat 方法是一个泛型方法,可以接受任意类型的参数。在使用时,编译器会根据传入的实际参数类型进行类型推断

通配符和泛型上下界

Java 泛型还引入了通配符泛型上下界的特性。

1)通配符

用于表示未知类型

示例代码:

// 使用通配符
public static void printValues(List<?> values) {for (Object value : values) {System.out.println(value);}
}public static void main(String[] args) {System.out.println("开始打印 整数");List<Integer> integers = Arrays.asList(1, 2, 3);printValues(integers);System.out.println("开始打印 小数");List<Double> doubles = Arrays.asList(1.1, 2.2);printValues(doubles);
}

输出结果:

开始打印 整数
1
2
3
开始打印 小数
1.1
2.2

在上述代码中,printValues 方法使用了通配符 ?,允许接受任意类型的 List。

2)泛型上下界

用于限定泛型类型的范围

示例代码:

// 使用泛型上下界
public static <T extends Number> double sum(List<T> numbers) {double total = 0;for (T number : numbers) {total += number.doubleValue();}return total;
}public static void main(String[] args) {List<Integer> integers = Arrays.asList(1, 2, 3, 4, 5);System.out.println("整数的加和结果是: " + sum(integers));List<Double> doubles = Arrays.asList(1.1, 2.2, 3.3, 4.4);System.out.println("小数的加和结果是: " + sum(doubles));
}

输出结果:

整数的加和结果是: 15.0
小数的加和结果是: 11.0

在上述代码中, sum 方法使用了泛型上下界 T extends Number,表示只能接受 Number 类型或其子类型

泛型的好处

  • 类型安全: 泛型提供了编译时的类型检查,避免了在运行时发生类型错误的可能性。
  • 代码复用: 泛型允许编写通用的代码,适用于多种数据类型,提高了代码的复用性。
  • 可读性和可维护性: 使用泛型能够使代码更加清晰、简洁,提高了代码的可读性和可维护性。

注意事项

  • 类型擦除: 泛型在编译时会进行类型擦除,即泛型信息在运行时被擦除,转换为原始类型。这可能导致一些限制,例如不能直接创建泛型数组。
  • 通配符限制: 使用通配符 <?> 时,只能读取,无法修改泛型集合中的元素。如果需要修改,可以使用 <? extends T><? super T>
  • 泛型和继承: 泛型不支持协变(covariant)和逆变(contravariant)。例如,List 不是 List 的子类型。
  • 原始类型和泛型混用: 尽量避免在泛型代码中使用原始类型,以保持类型安全。

用通配符 <?> 时,只能读取,无法修改泛型集合中的元素。如果需要修改,可以使用 <? extends T><? super T>

  • 泛型和继承: 泛型不支持协变(covariant)和逆变(contravariant)。例如,List 不是 List 的子类型。
  • 原始类型和泛型混用: 尽量避免在泛型代码中使用原始类型,以保持类型安全。

在实际编程中,合理利用泛型可以使代码更加健壮、灵活,但也需要注意一些泛型的特性和限制。通过了解和熟练使用泛型,可以写出更加清晰、安全和可维护的 Java 代码。

相关文章:

【Java 基础】16 泛型

文章目录 什么是泛型&#xff1f;泛型的声明泛型的使用泛型方法通配符和泛型上下界1&#xff09;通配符2&#xff09;泛型上下界 泛型的好处注意事项 泛型提供了一种在编写代码时更好地 支持类型安全的机制。通过泛型&#xff0c;我们可以编写更加 通用、 灵活、 可读性高的…...

Android framework定制1-->用户无操作一段时间,自动播放客户提供的视频,用户操作后退出播放

在PowerManagerService.java中监听用户操作&#xff0c;10秒无操作则打开预置的apk播放视频&#xff0c;直接上代码&#xff1a; --- a/frameworks/base/services/core/java/com/android/server/power/PowerManagerService.javab/frameworks/base/services/core/java/com/andr…...

Vmware17虚拟机安装windows10系统

不要去什么系统之家之类的下载镜像&#xff0c;会不好安装&#xff0c;镜像被魔改过了&#xff0c;适合真实物理机上的系统在PE里安装系统&#xff0c;建议下载原版系统ISO文件 安装vmware17pro 下载地址https://dwangshuo.jb51.net/202211/tools/VMwareplayer17_855676.rar 解…...

Golang实践录:读取yaml配置文件

本文对 yaml 文件进行解析。 下载 yaml执行 go get github.com/spf13/viper 安装。 golang 有很多库可以解释 yaml 文件。本文选用 viper 进行解析&#xff0c;执行 go get github.com/spf13/viper 安装。 yaml语法规则 yaml对大小写敏感。yaml的层级关系只能使用空格缩进&a…...

oracle sql相关语法

SQL*PLUS 在SQL*PLUS执行&#xff0c;会在执行后显示查询的执行计划和统计信息 SET AUTOTRACE ON;SELECT * FROM your_table WHERE column_name value;SET AUTOTRACE OFF;PLSQL PLSQL查询sql界面&#xff0c;鼠标右键&#xff0c;点击执行计划&#xff0c;会出现sql的执行计…...

el-table,列表合并,根据名称列名称相同的品名将其它列值相同的进行合并

el-table,列表合并,根据名称列名称相同的品名将其它列值相同的进行合并,并且不能跨品名合并 如图 用到el-table合并行的方法合并 tableSpanMethod({ row, column, rowIndex, columnIndex }) {if (column.property "materielName") {//合并商品名const _row this…...

微信小程序显示二维码?

wxml <canvas style"width: 100%;height: 100%;margin-left: 20%;" id"Canvase" type"2d"></canvas> js // pages/code/code.js Page({/*** 页面的初始数据*/data: {code: ,},/*** 生命周期函数--监听页面加载*/onLoad(options) {…...

JavaWeb开发全流程笔记

JavaWeb 前端Web开发javaScript1.JS引入2.JS基础语法3.JS函数4.JS对象 BOMDOM文档对象模型JS事件监听VueVue常用指令Vue的生命周期 AjaxAxios 前端工程化环境准备NodeJS安装和Vue-cli安装vue项目Vue组件库Element组件的使用 Vue路由Nginx打包部署 后端Web开发MavenSpringBootHT…...

LLM;超越记忆《第 2 部分 》

一、说明 在这篇博客中&#xff0c;我深入研究了将大型语言模型&#xff08;LLM&#xff09;提升到基本记忆之上的数学框架。我们探索了动态上下文学习、连续空间插值及其生成能力&#xff0c;揭示了 LLM 如何理解、适应和创新超越传统机器学习模型。 LLM代表了人工智能的重大飞…...

Python中的加法测试题实现

随机生成5道10以内的加法测试题&#xff0c;用户在10秒内使用键盘输入答案。完成全部5道答题之后&#xff0c;计算机生成答题记录报告&#xff0c;并对答题情况进行分析&#xff0c;显示“答对了”&#xff0c;或“答错了”、并显示正确答案。如果未能按时完成&#xff0c;则显…...

使用gcloud SDK 管理和部署 Cloud run service

查看cloud run 上的service 列表&#xff1a; gcloud run services list > gcloud run services listSERVICE REGION URL LAST DEPLOYED BY LAST DEPL…...

JS逆向-mytoken之code参数

前言 本文是该专栏的第60篇,后面会持续分享python爬虫干货知识,记得关注。 本文以mytoken为例,通过js逆向获取其code参数的生成规律。具体的“逆向”思路逻辑,笔者将会详细介绍每个步骤,并且将在正文结合“完整代码”进行详细说明。 接下来,跟着笔者直接往下看正文详细…...

第九节HarmonyOS 常用基础组件4-Button

一、Button Button组件主要用来响应点击操作&#xff0c;可以包含子组件。 示例代码&#xff1a; Entry Component struct Index {build() {Row() {Column() {Button(确定, { type: ButtonType.Capsule, stateEffect: true }).width(90%).height(40).fontSize(16).fontWeigh…...

常用数据预处理方法 python

常用数据预处理方法 数据清洗缺失值处理示例删除缺失值插值法填充缺失值 异常值处理示例删除异常值替换异常值 数据类型转换示例数据类型转换在数据清洗过程中非常常见 重复值处理示例处理重复值是数据清洗的重要步骤 数据转换示例 数据集成示例数据集成是将多个数据源合并为一…...

【无标题】AttributeError: module ‘gradio‘ has no attribute ‘outputs‘

问题描述 AttributeError: module gradio has no attribute outputs 不知道作者用的是哪个gradio版本&#xff0c;最新的版本报错AttributeError: module gradio has no attribute outputs &#xff0c; 换一个老一点的版本会报错AttributeError: module gradio has no attribu…...

无人机助力电力设备螺母缺销智能检测识别,python基于YOLOv7开发构建电力设备螺母缺销小目标检测识别系统

传统作业场景下电力设备的运维和维护都是人工来完成的&#xff0c;随着现代技术科技手段的不断发展&#xff0c;基于无人机航拍飞行的自动智能化电力设备问题检测成为了一种可行的手段&#xff0c;本文的核心内容就是基于YOLOv7来开发构建电力设备螺母缺销检测识别系统&#xf…...

动态页面技术的发展与应用

jsp 静态页面&#xff1a;web诞生后的html文档&#xff0c;不论多少次访问都是同一份html文档或者是其他的什么文档&#xff0c;所以说是”静态“的。 虽然js能让页面产生互动&#xff0c;但是不论什么人访问&#xff0c;看到的都是放在服务器的那一份写死的文件/文档activexa…...

1-算法基础-编程基础

1.基本数据类型 char ch A; char s[] "hello";2.const定义常量 const int N 1e5 9;//const定义常量&#xff0c;后续不可被修改 int a[N];3.万能头文件 C11等可用 #include<bits/stdc.h> using namespace std;4.typedef typedef long long kk; kk a[20…...

HarmonyOS应用开发——程序框架UIAbility、启动模式与路由跳转

前言 UIAbility简单来说就是一种包含用户界面的应用组件&#xff0c;用于和用户进行交互。每一个UIAbility实例&#xff0c;对应于一个最近任务列表中的任务。 一个应用可以有一个UIAbility&#xff0c;也可以有多个UIAbility。一个UIAbility可以对应于多个页面&#xff0c;建议…...

node.js-连接SQLserver数据库

1.在自己的项目JS文件夹中建文件&#xff1a;config.js、mssql.js和server.js以及api文件夹下的user.js 2.在config.js中封装数据库信息 let app {user: sa, //这里写你的数据库的用户名password: ,//这里写数据库的密码server: localhost,database: medicineSystem, // 数据…...

Java并发编程:CompletableFuture实战

Java并发编程&#xff1a;CompletableFuture实战 引言 Java 8引入的CompletableFuture是现代异步编程的重要工具&#xff0c;它不仅解决了Future的局限性&#xff0c;还提供了丰富的API用于组合、转换和处理异步结果。相比传统的Future&#xff0c;CompletableFuture支持流式调…...

AI智能体生态的包管理器:agenticmarket-cli 设计与实践

1. 项目概述&#xff1a;一个面向AI智能体生态的命令行工具如果你和我一样&#xff0c;长期在AI智能体&#xff08;Agent&#xff09;这个领域里折腾&#xff0c;那你肯定经历过这样的场景&#xff1a;为了测试一个最新的开源智能体框架&#xff0c;你需要先找到它的GitHub仓库…...

终极免费城通网盘直连解析工具:告别下载限速的完整指南

终极免费城通网盘直连解析工具&#xff1a;告别下载限速的完整指南 【免费下载链接】ctfileGet 获取城通网盘一次性直连地址 项目地址: https://gitcode.com/gh_mirrors/ct/ctfileGet 还在为城通网盘下载速度慢、等待时间长而烦恼吗&#xff1f;ctfileGet是一款专为城通…...

Path of Building:3个步骤从Build小白到规划大师的完整指南

Path of Building&#xff1a;3个步骤从Build小白到规划大师的完整指南 【免费下载链接】PathOfBuilding Offline build planner for Path of Exile. 项目地址: https://gitcode.com/GitHub_Trending/pa/PathOfBuilding Path of Building作为流放之路玩家最信赖的Build规…...

Godot游戏集成Discord状态:RPC插件原理与实战指南

1. 项目概述&#xff1a;在Godot引擎中点亮你的Discord状态 如果你是一名独立游戏开发者&#xff0c;或者正在用Godot引擎捣鼓一些有趣的个人项目&#xff0c;你可能会想让你的朋友或社区成员知道你现在正在“玩”什么。不是通过截图发到社交媒体&#xff0c;而是更实时、更优…...

Arm CoreLink PCK-600电源管理架构与寄存器编程详解

1. Arm CoreLink PCK-600电源控制架构解析在嵌入式系统设计中&#xff0c;电源管理单元&#xff08;PMU&#xff09;是实现高效能耗控制的核心组件。Arm CoreLink PCK-600作为业界领先的电源控制解决方案&#xff0c;其架构设计体现了现代SoC电源管理的先进理念。PCK-600系列采…...

终极指南:如何用WarcraftHelper让魔兽争霸3在现代电脑上完美运行 [特殊字符]

终极指南&#xff1a;如何用WarcraftHelper让魔兽争霸3在现代电脑上完美运行 &#x1f3ae; 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 还在为《魔…...

OpenAgentsControl:构建多智能体协同系统的开源框架解析

1. 项目概述&#xff1a;一个面向智能体控制的开放框架最近在折腾AI智能体&#xff08;Agent&#xff09;相关的项目&#xff0c;发现一个挺有意思的开源仓库&#xff1a;darrenhinde/OpenAgentsControl。这个项目名字直译过来就是“开放智能体控制”&#xff0c;听起来就很有搞…...

EL线创客工作坊:从零到一的电致发光项目实践指南

1. 项目概述&#xff1a;为什么EL线工作坊是创客入门的绝佳选择如果你正在寻找一个能让新手快速上手、成品炫酷、且能完美融合电子与手工的创客项目&#xff0c;EL线工作坊几乎是一个无可挑剔的答案。EL&#xff0c;即电致发光&#xff0c;它不像LED那样依赖一个个分立的光点&a…...

基于Feather微控制器的智能灯光系统:颜色感应与BLE遥控实现

1. 项目概述与核心价值又到了折腾点节日氛围的时候了。往年都是买现成的彩灯串&#xff0c;总觉得少了点意思&#xff0c;今年决定自己动手&#xff0c;做个能“听懂”指令、甚至能“看见”颜色的智能灯光系统。这个项目的核心&#xff0c;就是用一块小小的微控制器&#xff0c…...