news 2026/6/15 16:52:03

泛型的相关知识

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
泛型的相关知识

定义类、接口、方法时,同时声明了一个或多个类型变量(如:<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的父类

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/15 16:03:46

2025年不容错过的免费降AIGC工具使用详解,0元降ai

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

作者头像 李华
网站建设 2026/6/15 16:02:00

Ascend C 安全可信与跨平台移植:构建企业级 AI 推理系统的工程实践 引言:从“能跑”到“可靠、安全、可移植”

在金融、政务、医疗等关键领域&#xff0c;AI 系统不仅要求高性能&#xff0c;更需满足 安全性、可靠性、可审计性。同时&#xff0c;随着国产芯片多元化&#xff08;昇腾、寒武纪、天数等&#xff09;&#xff0c;跨平台可移植性 也成为企业级部署的核心诉求。Ascend C 作为昇…

作者头像 李华
网站建设 2026/6/15 8:46:56

springboot校园宿舍报修管理系统_a689622m(源码+lw+部署讲解+答辩ppt)

目录 已开发项目效果实现截图开发技术系统开发工具&#xff1a; 核心代码参考示例1.建立用户稀疏矩阵&#xff0c;用于用户相似度计算【相似度矩阵】2.计算目标用户与其他用户的相似度系统测试总结源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&am…

作者头像 李华
网站建设 2026/6/15 15:44:38

Gleam语言深度解析:类型安全与跨平台编程的新范式

Gleam语言深度解析&#xff1a;类型安全与跨平台编程的新范式 【免费下载链接】gleam &#x1f31f;一种用于构建类型安全、可扩展系统的友好型编程语言&#xff01; 项目地址: https://gitcode.com/GitHub_Trending/gl/gleam 在当今软件开发领域&#xff0c;类型安全和…

作者头像 李华
网站建设 2026/6/15 13:40:14

Python文件操作与异常处理:编写健壮的程序

文章目录 前言 一、文件的概念 1、什么是文件 2、文件操作的作用 二、文件的基本操作 1、打开文件 2、读取文件内容 3、write函数写入文件 4、关闭文件 5、入门级案例 三、上下文管理器&#xff1a;更优雅的文件操作 四、Python异常处理机制 1、基本语法 2.文件操作中常见的异常…

作者头像 李华