泛型的相关知识

定义类、接口、方法时,同时声明了一个或多个类型变量(如:<E>),称为泛型类、泛型接口、泛型方法,他们统称为泛型

public class ArrayList<E>{ //... }

作用:泛型提供了在编译阶段约束所能操作的数据类型,并自动进行检查的能力,这样可以避免强制类型转换,及其可能出现的异常。

泛型的本质:把具体的数据类型作为参数传递给类型变量。

为什么要使用泛型

先来看我们不使用泛型时往集合中添加元素有什么问题

import java.util.ArrayList; import java.util.Iterator; public class Test { public static void main(String[] args) { //1.创建集合的对象 ArrayList list = new ArrayList(); //2.添加数据 list.add(123); list.add("aaa"); list.add(new Student("zhangsan", 21)); //3.遍历集合,获取里面的每一个元素 Iterator it = list.iterator(); while (it.hasNext()) { Object obj = it.next(); System.out.println(obj); } } }

输出结果:

当你往ArrayList集合中添加数据时,调用add()方法,会显示添加的数据是Object类型,也就是什么类型都可以添加,比如int类型、String类型,甚至是自己定义的Student类型,使用iterator()迭代器遍历集合中的元素,用next()方法拿到的元素也是Object类型的,我们可以将其打印输出,没有问题。但是,多态的弊端是不能访问子类特有的功能,比如我想打印输出第二个元素"aaa"的长度,这是一个String类型的数据,直接使用obj.length()来输出长度,但其实这样写是会报错的,编译就不通过

那如果强制转换

你会发现编译通过了,语法没有问题,但是运行会报错。

报了一个类型转换异常,为什么会报这个异常呢?

如果你是int类型转成String类型那没问题,但是遍历的是数组中的整个元素,自定义的Student类型怎么转成String类型呢,所以会报一个类型转换异常。

通过以上现象我们发现,当往集合中添加任意类型元素时,不能访问子类特有的功能,如果使用强制类型转换则可能会出现类型转换异常,所以使用泛型来解决这个问题。

import java.util.ArrayList; import java.util.Iterator; public class Test { public static void main(String[] args) { //1.创建集合的对象 ArrayList<String> list = new ArrayList(); //2.添加数据 // list.add(123); list.add("aaa"); list.add("bbb"); list.add("ccc"); // list.add(new Student("zhangsan", 21)); //3.遍历集合,获取里面的每一个元素 Iterator<String> it = list.iterator(); while (it.hasNext()) { String str = it.next(); System.out.println(str); } } }

使用泛型<String>来规定ArrayList数组中的数据类型只能是String类型,这样就保证了数组中数据类型的统一,把运行时期的问题提前到了编译时期,避免了强制类型转换可能出现的异常。

泛型的分类

前面提到,在定义类、接口、方法时,同时声明了一个或多个类型变量(如:<E>),称为泛型类、泛型接口、泛型方法,泛型也就分为这三类,每类都各自有各自的格式。

泛型类

格式:

修饰符 class 类名<类型变量,类型变量,...> {

}

public class ArrayList<E>{ ... }

类型变量建议用大写的英文字母,常用的有:E、T、K、V

自定义泛型类

自定义泛型类——声明单个

public class MyArrayList<E> { private Object[] arr = new Object[10]; private int size;//记录当前位置的 public boolean add(E e){ arr[size++] = e; return true; } public E get(int index){ return (E) arr[index]; } }

自定义泛型类——声明多个

public class MyClass1<E, T> { public void put(E e, T t){ } }

自定义泛型类——必须要继承某个类

public class MyClass2<E extends Animal> { }

泛型接口

格式:

修饰符 interface 接口名<类型变量, 类型变量, ...>{
}

public interface A<E> { ... }

举例:

public interface Data<T> { void add(T t); ArrayList<T> getByName(String name); }

泛型方法

格式:

修饰符 <类型变量, 类型变量, ...> 返回值类型 方法名(形参列表) {

}

public static <T> void test(T t) { }

注意这个下面这个不是泛型方法:

public E get(int index) { return (E) arr[index]; }

补充知识

拓展知识:

当你在java文件中使用了泛型来限制数据类型,但当这个java文件编译成class文件后就没有你写的泛型了,统一当成Object类型处理,只是当你往外取数据时,底层会帮你再次强转成你所定义的泛型。

泛型的细节:

  1. 泛型是工作在编译阶段的,一旦程序编译成class文件,class文件中就不存在泛型了,这叫做泛型擦除
  2. 泛型不支持基本数据类型,只能支持对象类型(引用数据类型)。
  3. 指定泛型的具体数据类型后,传递数据时,可以传入该类类型或者其子类类型
  4. 如果不写泛型,默认是Object类型

通配符

就是“?”,可以在“使用泛型”的时候代表一切类型;

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

泛型的上下限

泛型上限:? extends A:?能接收的必须是A或者是A的子类

泛型下线:? super A:?能接收的必须是A或者是A的父类

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

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

相关文章

完整教程:对于数据结构:链式二叉树的超详细保姆级解析—中

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025免费降AI率完全指南:从工具选择到实操技巧,一步到位

在论文、报告、内容创作越来越严格的时代&#xff0c;查AI率、检测AI率、降AI率 已经成为学生、写作者、博主的日常需求。很多同学因为 AI率过高被导师指出“AI痕迹太重”&#xff0c;甚至退回重写。本文今天一次性告诉你&#xff1a; 检测AI率应该注意什么 免费查AI率的网站有…

2025年降AI率工具实测!5个降AI工具推荐:免费降AIGC工具指南

在论文、报告、内容创作越来越严格的时代&#xff0c;查AI率、检测AI率、降AI率 已经成为学生、写作者、博主的日常需求。很多同学因为 AI率过高被导师指出“AI痕迹太重”&#xff0c;甚至退回重写。本文今天一次性告诉你&#xff1a; 检测AI率应该注意什么 免费查AI率的网站有…

2025免费降AI率完全指南:从降AI工具选择到实操技巧,一步到位!

在论文、报告、内容创作越来越严格的时代&#xff0c;查AI率、检测AI率、降AI率 已经成为学生、写作者、博主的日常需求。很多同学因为 AI率过高被导师指出“AI痕迹太重”&#xff0c;甚至退回重写。本文今天一次性告诉你&#xff1a; 检测AI率应该注意什么 免费查AI率的网站有…

Halo博客系统审计

项目搭建 轻快,简洁,功能强大,使用 Java 开发的博客系统。软件名称 版本操作系统 Windows10Java JDK1.8_261(https://www.oracle.com/co/java/technologies/javase/javase8-archive-downloads.html,往下滑)Maven…

2025免费降AI率完全指南:从查AI工具选择到降AI技巧,一步到位!

在论文、报告、内容创作越来越严格的时代&#xff0c;查AI率、检测AI率、降AI率 已经成为学生、写作者、博主的日常需求。很多同学因为 AI率过高被导师指出“AI痕迹太重”&#xff0c;甚至退回重写。本文今天一次性告诉你&#xff1a; 检测AI率应该注意什么 免费查AI率的网站有…

终极指南:快速搭建Gitea自托管Git服务

终极指南&#xff1a;快速搭建Gitea自托管Git服务 【免费下载链接】gitea 喝着茶写代码&#xff01;最易用的自托管一站式代码托管平台&#xff0c;包含Git托管&#xff0c;代码审查&#xff0c;团队协作&#xff0c;软件包和CI/CD。 项目地址: https://gitcode.com/gitea/gi…

数字电路模拟程序课堂测验-总结

数字电路模拟程序&课堂测验-总结(1)前言: OOP题目集04:数字电路模拟程序-1题目描述: 数字电路是一种处理离散信号的电子电路。与处理连续变化信号(如声音、温度)的模拟电路不同,数字电路只识别和运算两种基…

python中的“内置函数”

Python中的“高级工具” lambda函数 python除了使用def创建函数&#xff0c;还可以用lambda表达式。lambda表达式是一个用lambda关键字创建的功能简单的小型函数对象&#xff0c;一般把函数结果赋值给一个变量&#xff0c;通过这个变量来调用lambda&#xff0c;而不是如def语句…

tk.simpledialog-创建简单的模态对话框

tkinter.simpledialog 是 Python 标准库 tkinter 中的一个模块,专门用于创建简单的模态对话框,以获取用户输入的特定类型数据(如字符串、整数、浮点数)。以下是其核心功能与使用方法的详细解析: 核心功能数据类型…

STranslate 翻译 工具 v2.0.0 绿色便携版 翻译、OCR工具

软件介绍 STranslate翻译是一款免费的 Windows 划词翻译与 OCR&#xff08;光学字符识别&#xff09;文字识别工具&#xff0c;通过快捷键可实现屏幕上任意区域的文字识别与翻译功能&#xff0c;简单易用。 该软件以「即开即用、即用即走」为开发理念&#xff0c;主打快速、便…

Vue脚手架快速搭建指南

一&#xff0c;Vue 技术文章大纲 1&#xff0c;Vue 框架概述 Vue.js 简介&#xff1a;轻量级、渐进式前端框架核心特点&#xff1a;响应式数据绑定、组件化开发、虚拟 DOM适用场景&#xff1a;单页应用&#xff08;SPA&#xff09;、复杂交互界面 2&#xff0c;Vue 核心概念…

终极指南:免费获取卓里奇数学分析教材PDF完整资源

终极指南&#xff1a;免费获取卓里奇数学分析教材PDF完整资源 【免费下载链接】数学分析卓里奇经典的俄罗斯教材第二册PDF资源介绍 《数学分析&#xff08;卓里奇&#xff09;经典的俄罗斯教材&#xff08;第二册&#xff09;》PDF资源库为您提供了一部享誉全球的数学经典教材。…

根据实际体验,优先选择支持多轮修改、学术规范严格的平台更省心。

2025年最新测评显示&#xff0c;以下6款AI论文工具在降重、AIGC率优化及文本润色方面表现突出&#xff1a;ChatGPT在创意生成和框架搭建上优势明显&#xff0c;Claude擅长学术语言规范化&#xff0c;QuillBot的改写功能对降低重复率效果显著&#xff0c;Grammarly专注于语法修正…

毕业设计实战:基于SpringBoot+MySQL的毕业生实习与就业管理系统设计与实现,从需求到测试全流程避坑指南!

毕业设计实战&#xff1a;基于SpringBootMySQL的毕业生实习与就业管理系统设计与实现&#xff0c;从需求到测试全流程避坑指南&#xff01; 谁懂啊&#xff01;当初做毕业生实习与就业管理系统毕设时&#xff0c;光“就业信息表”和“学生表”的外键关联就卡了3天——一开始没给…

Pyperclip终极指南:3分钟掌握Python跨平台剪贴板操作

Pyperclip终极指南&#xff1a;3分钟掌握Python跨平台剪贴板操作 【免费下载链接】pyperclip Python module for cross-platform clipboard functions. 项目地址: https://gitcode.com/gh_mirrors/py/pyperclip Pyperclip是一个专为Python开发者设计的跨平台剪贴板操作库…

毕业设计实战:基于SSM+MySQL的校园外卖服务系统设计与实现,从需求到上线全流程指南!

毕业设计实战&#xff1a;基于SSMMySQL的校园外卖服务系统设计与实现&#xff0c;从需求到上线全流程指南&#xff01; 当初做校园外卖系统毕设时&#xff0c;光“外卖订单”和“购物车”的数据同步就卡了3天——购物车结算时库存没校验&#xff0c;导致超卖&#xff0c;导师一…

COMSOL模拟锌离子电池锌负极电场模型教程:从零开始构建并详细解析源文件,适合初学者的电场建模教学

comsol模拟锌离子电池锌负极电场模源文件与详细教程&#xff08;适合初学者&#xff09; 资料包含电场模型制作详细过程教学&#xff0c;以及若干种模型源文件可供学习完模仿参考打开COMSOL时总有人被满屏的物理场接口劝退&#xff0c;今天咱们用锌离子电池负极电场模拟为例&am…

5分钟掌握LIBERO:开启终身机器人学习的革命性平台

5分钟掌握LIBERO&#xff1a;开启终身机器人学习的革命性平台 【免费下载链接】LIBERO 项目地址: https://gitcode.com/gh_mirrors/li/LIBERO LIBERO是一个专门研究知识迁移和终身学习能力的机器人学习基准平台&#xff0c;旨在解决多任务和终身机器人学习中的核心挑战…

毕业设计实战:基于SpringBoot+MySQL的家政服务平台设计与实现,从需求到测试全流程避坑指南!

毕业设计实战&#xff1a;基于SpringBootMySQL的家政服务平台设计与实现&#xff0c;从需求到测试全流程避坑指南&#xff01; 谁懂啊&#xff01;当初做家政服务平台毕设时&#xff0c;光“服务预约表”和“雇员表”的外键关联就卡了3天——一开始没给服务预约表设“雇员账号”…