六、java高级-泛型(一)

六、泛型

1、泛型

从什么是泛型、泛型从何而来、泛型出现是为了解决什么问题、功能及作用说泛型

1.1什么是泛型?

泛型:即“参数化类型”,也就是将需要操作对象的类型进行参数化。在编写代码的时候,不必声明操作对象(函数、类、接口和方法等)的类型,而是在使用时在确定,并且可以在编译时检查类型是否匹配。

泛型就好比标记容器的一个标签,而容器可以容纳各种类型的数据,泛型就用于标记容器可以容纳那种类型的数据,但具体放入什么样的数据需要在使用时确定。比如说,这个容器他就是用来盛放调料的,一个调料瓶用来装盐贴个贴纸标记好,一个用来装辣椒写上辣椒用贴纸标记好。再比如,泛型在用于集合中,ArrayList< String >只能用于处理String类型的元素,ArrayList< Integer>只能处理数值类型的元素。

  • 格式:< E > 、< T >只能指定引用类型,不能指定为基本数据类型/void
【修饰符】 class 类名<类型变量列表>extends 父类】 【implements 父接口们】{}
【修饰符】 interface 接口名<类型变量列表>implements 父接口们】{}
【修饰符】 <类型变量列表> 返回值类型 方法名(【形参列表】)throws 异常列表】{//...
}eg:
public class ArrayList<E>    
public interface Map<K,V>{....
} 
//java.util.Arrays类中的
public static <T> List<T> asList(T... a){....
}
1.2 泛型从何而来?

泛型是从jdk1.5开始引入的。泛型的引用大大提高了代码的复用性,使得在编写代码的时候可以不必重复编写对不同类型的数据的操作。和数据结构最开始介绍的抽象数据类型(ADT)和参数化类型一个道理。ADT中允许程序员定义数据类型的抽象形式及该数据类型相关的操作,而不必暴露其内部实现。参数化类型则允许类型或数据结构的行为根据传入的参数类型而变化。

以add()方法举例:

public void add(){int a;int b;System.out.println(a+b);
}

如果我要使用上述的add()方法,怎么让我需要处理的数据传递进去呢?由此引入了形参和实参的概念。方法体功能的具体实现,需要外界提供具体的数据,在调用这个方法时,方法里面的参数值才能确定。

方法定义时,可以指定一个或多个参数,用于接收调用该方法时传递的数据。这些参数可以是基本类型(如整数、浮点数等)或对象类型(如字符串、自定义对象等)。当调用方法时,传递的数据会被赋值给这些参数,方法内部可以通过这些参数来访问和处理数据。

public void add(int a,int b){int a;int b;System.out.println(a+b);
}

而泛型是如何传递数据的呢

  • 一样的道理→参数类型、返回值

在泛型中,参数化类型(即泛型类型)是在定义方法或类时指定的,而不是在调用时指定的。因此,泛型方法或泛型类在定义时可以包含形式参数(泛型参数),这些参数用于表示方法或类中的类型。在调用泛型方法或实例化泛型类时,可以为这些形式参数提供实际的类型参数,以确定方法或类中所使用的具体类型。

public <T> void printData(T data) {System.out.println(data);
}// 调用泛型方法,并传递不同类型的数据
printData("Hello"); // T 被实例化为 String 类型
printData(123);     // T 被实例化为 Integer 类型
1.3 泛型的出现是为了解决什么问题呢?

(俺学到集合这里便以集合举例)

1、数据类型匹配问题

我们都知道集合可以存储多种数据类型,实际上ArrayList内部就是一个Object[],数组在用foreach迭代时,迭代的对象的数据类型时objetc。在传入数据时很容易出错,不方便。

ArrayList arr1 = new ArrayList();
arr1.add("zhangsan");
arr1.add("lisi");
arr1.add("wangwu");
arr1.add("xiaoming");
arr1.add(new Integer(123));
for (Object o : arr1) {}

2、强制转换问题

并且如果需要获取到Object,必须进行强制转型为String,并且容易出现错误。

String s1 = (String) arr1.get(0);
String s2 = (String) arr1.get(4);//ClassCastException

解决办法:

  1. 为每种数据类型单独编写→代码重复高
  2. 泛型:泛型就是定义一种模板,例如ArrayList<T>,然后在代码中为用到的类创建对应的ArrayList<类型>
ArrayList<String> arr2 = new ArrList();
arr2.add("hello");
arr2.add(1);//报错
for(String s : arr2){System.out.println(s);
}
1.4 功能及作用
  1. 代码重用和灵活性: 可以处理多种不同类型的数据
  2. 类型安全和错误检测: 可以在编译时进行类型检查,防止数据不匹配问题
  3. **减少类型转换和异常:**编译器可以自动处理类型转换
  4. 提高性能: 泛型在编译时或运行时会进行类型擦除或优化处理,以提高代码的性能。例如,Java中的类型擦除会将泛型代码转换为非泛型的形式,以提高代码的执行效率。

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

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

相关文章

docker从入门到入土

docker到底是什么&#xff1f; docker是世界领先的软件容器平台&#xff0c;基于GO语言进行开发实现docker能够自动执行重复性任务&#xff0c;例如搭建和配置开发环境&#xff0c;从而解放开发人员用户可以方便地创建和使用容器&#xff0c;把自己的应用放入容器&#xff0c;…

基于Robei EDA--实现串口通信

一、串口简介 串口作为常用的三大低速总线&#xff08;UART、SPI、IIC&#xff09;之一&#xff0c;在设计众多通信接口和调试时占有重要地位。但UART和SPI、IIC不同的是&#xff0c;它是异步通信接口&#xff0c;异步通信中的接收方并不知道数据什么时候会到达&#xff0c;所…

int VS Integer

在Java中&#xff0c;int 是一种基本数据类型&#xff08;primitive type&#xff09;&#xff0c;而 Integer 是 int 的包装类&#xff08;wrapper class&#xff09;。它们之间的主要区别在于以下几点&#xff1a; 数据类型&#xff1a;int 是基本的整数类型&#xff0c;它在…

Linux gzip命令教程:如何有效地压缩和解压文件(附实例详解和注意事项)

Linux gzip命令介绍 gzip&#xff08;GNU zip&#xff09;是一种在Linux系统中常见的命令行压缩工具。它使用DEFLATE压缩算法来减小文件的大小&#xff0c;使文件更易于存储和传输。gzip主要用于压缩文本文件、Tar归档文件和网页。不建议使用gzip来压缩图像、音频、PDF文档和其…

【P1506 拯救oibh总部】

拯救oibh总部 题目背景 oibh 总部突然被水淹没了&#xff01;现在需要你的救援…… 题目描述 oibh 被突来的洪水淹没了&#xff0c;还好 oibh 总部有在某些重要的地方起一些围墙。用 * 号表示&#xff0c;而一个四面被围墙围住的区域洪水是进不去的。 oibh 总部内部也有许…

【后端高频面试题--SpringBoot篇】

&#x1f680; 作者 &#xff1a;“码上有前” &#x1f680; 文章简介 &#xff1a;后端高频面试题 &#x1f680; 欢迎小伙伴们 点赞&#x1f44d;、收藏⭐、留言&#x1f4ac; 这里写目录标题 1.什么是SpringBoot&#xff1f;它的主要特点是什么&#xff1f;2.列举一些Spri…

《CSS 简易速速上手小册》第4章:视觉美学(2024 最新版)

文章目录 4.1 颜色理论在 CSS 设计中的应用&#xff1a;网页的调色盘4.1.1 基础知识4.1.2 重点案例&#xff1a;创建一个具有情感设计的登录页面4.1.3 拓展案例 1&#xff1a;使用颜色增强信息的可视化表示4.1.4 拓展案例 2&#xff1a;利用颜色创建网站的品牌身份 4.2 字体与文…

JS逆向手记01__前端基础

系列文章目录 系列手记占位 文章目录 系列文章目录前言一、js自执行函数语法二、js变量类型的转换&#xff08;与字符串相加&#xff09;三、浏览器环境&#xff08;BOM&#xff09;四、html渲染环境&#xff08;DOM&#xff09;五、html发起请求&#xff08;表单form&#xf…

书生·浦语大模型第四课作业

基础作业&#xff1a; 构建数据集&#xff0c;使用 XTuner 微调 InternLM-Chat-7B 模型, 让模型学习到它是你的智能小助手&#xff0c;效果如下图所示&#xff0c;本作业训练出来的模型的输出需要将不要葱姜蒜大佬替换成自己名字或昵称&#xff01; 1.安装 # 如果你是在 Int…

Java是如何实现的平台无关?

&#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是小徐&#x1f947;☁️博客首页&#xff1a;CSDN主页小徐的博客&#x1f304;每日一句&#xff1a;好学而不勤非真好学者 &#x1f4dc; 欢迎大家关注&#xff01; ❤️ 1、什么是平台无关性 平台无关性就是一种语言在…

寒假作业

手写盗版微信登入界面 #include "mainwindow.h" #include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow) {ui->setupUi(this);this->resize(421,575);this->setFixedSize(421,575);th…

C#系列-C#EF框架实现雪花主键(20)

在C#中&#xff0c;使用Entity Framework (EF) 框架并不直接涉及到主键的生成策略。主键的生成通常是在数据库层面或者在应用程序层面处理的。雪花主键&#xff08;Snowflake ID&#xff09;是一种在分布式系统中生成唯一ID的算法&#xff0c;它通常是由Twitter的雪花算法演变而…

接口测试框架分析

框架大体上已经写完了&#xff0c;不过说实话好多代码让我自己写我也写不出来&#xff0c;那该怎么办呢&#xff1f;很简单&#xff0c;把现在已经写好的代码保存起来&#xff0c;等用的时候拿出来复制粘贴就好了&#xff0c;如果你是大神&#xff0c;自己会写&#xff0c;那就…

TikTok:短视频时代的崛起

导言&#xff1a; TikTok&#xff0c;作为一款全球短视频社交应用&#xff0c;正风靡全球&#xff0c;引领着数字娱乐的新潮流。其简洁的用户界面、创意无限的短视频内容&#xff0c;以及强大的社交互动功能&#xff0c;使其成为全球数以亿计的用户喜爱的平台。 TikTok的特点&a…

H5 红色文字抖动网址发布页/引导页源码

H5 红色文字抖动网址发布页/引导页源码 源码介绍&#xff1a;一款红色文字抖动网页源码&#xff0c;可用于引导页或网址发布页。 下载地址&#xff1a; https://www.changyouzuhao.cn/10470.html

第9讲用户信息修改实现

用户信息修改实现 后端修改用户昵称&#xff1a; /*** 更新用户昵称* param wxUserInfo* param token* return*/ RequestMapping("/updateNickName") public R updateNickName(RequestBody WxUserInfo wxUserInfo,RequestHeader String token){if(StringUtil.isNot…

在JavaScript或TypeScript中,@符号的用法

在JavaScript或TypeScript中&#xff0c;符号在导入语句中用作包名的一部分&#xff0c;表示该包是一个命名空间包&#xff08;Namespace package&#xff09;或作用域包&#xff08;Scoped package&#xff09;。这种命名方式主要用于组织和管理由同一组织或个人发布的相关包。…

MySQL篇----第二十二篇

系列文章目录 文章目录 系列文章目录前言一、什么是表级锁二、什么是页级锁三、什么是行级锁四、什么是悲观锁前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 一、…

selenium 驱动 Edge浏览器,解决selenium打开Edge浏览器闪退问题

一、Edge浏览器驱动下载 1、在设置中查看浏览器的版本号 2、在官网中进行对应下载 Microsoft Edge WebDriver - Microsoft Edge Developer 二、环境变量配置 1、打开设置界面 右击【此电脑】---选择【属性】----选择【高级系统设置】-----点击【环境变量】 2、变量设置 在…

SpringCloud-项目引入Nacos

一、安装Nacos服务 首先&#xff0c;我们需要从 Nacos 的官方网站下载发布版本。下载地址&#xff1a;Releases alibaba/nacos GitHub 选择合适的版本并下载&#xff0c;解压缩得到 Nacos 的安装包。 在解压后的 Nacos 目录中&#xff0c;找到 bin 文件夹。 用写字板编辑…