Java SE(七)之泛型(泛型类,泛型接口,泛型方法)

article/2025/9/21 6:05:15

文章目录

  • 泛型概述
    • 1.泛型的引入
    • 2.泛型的定义
    • 3.泛型的好处
    • 4.泛型标记符
  • 泛型类
  • 泛型方法
  • 泛型接口
  • 通配符
  • 与C++模板类
  • 可变参数

泛型概述

JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。

泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。
将类型由原来的具体类型参数化,然后在使用/调用时传入具体的类型

这个参数化可以用在类,方法,接口中

1.泛型的引入

先来看看泛型的背景:

(1)需要一个排序算法,能对整型数组、字符串数组甚至其他任何类型的数组进行排序,该如何实现?——Java 泛型。

(2)如果在创建ArrayList集合时没有指定数据类型,则会默认为所有的数据类型都是object类型,此时可以往集合添加任意的数据类型。

// 创建时没有指定数据类型(即Object类型)
ArrayList list = new ArrayList();// 此时可以添加任意数据类型
list.add(123);
list.add("hello");// 如果我们想要获取元素,此时就会报错(即使强转有时也不行)
String s = (String)list.get(0);

这样做的坏处:在获取/使用数据时,不知道强转为什么类型,并且无法使用他的特有行为。

此时推出了泛型,可以在添加数据的时候就把类型进行统一。而且我们在获取数据的时候,也省的强转了,非常的方便。

2.泛型的定义

<类型>:指定一种类型的格式
<类型1,类型2>:指定多种类型的格式

这里的类型在定义的时候可以看成形参
而在之后调用时给定的类型可以看成实参,实参只能是引用数据类型

如果要基本数据类型,需要用到他们的包装类:
(关于基本类型和引用类型区别,可参见:http://t.csdn.cn/xCg4M)

3.泛型的好处

  • 统一数据类型
  • 把运行时期的问题提前到了编译期间,避免了强制数据类型转换

4.泛型标记符

符号含义
E - Element在集合中使用(集合中存放的是元素)
T - TypeJava 类
K - Key
V - Value
N - Number数值类型
不确定的 java 类型

泛型类

当一个类中,某个变量的数据类型不确定时,就可以定义带有泛型的类

class 类名<E> {
}

创建该类对象时,E就确定类型

可以定义自己的泛型类,例如:

public class MyArrayList <E>{int size;Object[] object = new Object[10];// E表示不确定的类型,在类名后已经声明// e 是形参public boolean add(E e){object[size] = e;size++;return true;}public E get(int index){return (E)(object[index]);}
}

创建对象(和ArrayList操作很相似):

MyArrayList<Integer> list = new MyArrayList<>();
list.add(12);
list.add(23);
int num = list.get(0);

泛型方法

方法中形参类型不确定时,采用泛型方法

定义格式:

修饰符 <类型> 返回值类型 方法名(类型 变量名){ }
e.g. public <T> void show(T t) { }

e.g.

public static < E > void printArray( E[] inputArray ){// 输出数组元素            for ( E element : inputArray ){        System.out.printf( "%s ", element );}System.out.println();}

在调用时指定数据类型即可

Integer[] intArray = { 1, 2, 3, 4, 5 };
printArray( intArray  ); // 传递一个整型数组Double[] doubleArray = { 1.1, 2.2, 3.3, 4.4 }; 
printArray( doubleArray ); // 传递一个双精度型数组

泛型接口

定义格式:

修饰符 interface 接口名<类型>{ }
e.g. public interface List<T>{ }

使用泛型接口的两种方式:

1.实现类给出具体的类型

public class MyArrayList1 implements List<String> {
}

此时需要重写List接口中的抽象方法,并且原本List接口中的泛型E都要用String进行代替,即用具体类给出具体类型

在创建对象时,也不用像泛型那样创建,可以直接和普通类对象一样(因为泛型已经被确定了)

MyArrayList1 myArrayList = new MyArrayList();

2.实现类延续泛型,在创建对象时再确定类型

public class MyArrayList2<E> implements List<E> {
}

那么在创建对象时就需要指定泛型类型

MyArrayList2<String> myArrayList = new MyArrayList2<>();

通配符

定义一个方法,形参是集合,但是集合中的类型不确定,此时可以采用泛型方法

public static<E> void method(ArrayList<E> list){}

使用泛型方法有个缺点,就是它可以接受任意的数据类型,比如这里有四个类,分别是有继承关系的三个类Ye,Fu,Zi和另一个普通类Student类

class Ye {}class Fu extends Ye{}class Zi extends Fu{}class Student{}

当只希望传递限定的类型时,可以使用通配符

通配符:?

具体用法:

? extends E:表示可以传递E或者E的所有子类类型
? super E : 表示可以传递E或者E的所有父类类型

例如当我只传递Ye Fu Zi 这三个类时,可以用通配符限定

public static void method(ArrayList<? extends Ye> list){}

注意:
泛型不能继承,但是数据能继承

泛型指定类型后只能是该类型,他的子类或者父类是不允许的
但是数据可以有继承性:

// 声明一个方法,形参是 ArrayList 集合,集合对象是Ye对象
public static void method(ArrayList<Ye> list){
}public static void main(String[] args) {// 创建三个对象集合ArrayList<Ye> list1 = new ArrayList<>();ArrayList<Fu> list2 = new ArrayList<>();ArrayList<Zi> list3 = new ArrayList<>();method(list1);/*报错 ,因为需要的是Ye类型的对象,其他的类型对象不可以也就是说泛型不能继承。*/// method(list2);
}
// 添加对象时可以
list1.add(new Ye());
list1.add(new Fu());
list1.add(new Zi());

与C++模板类

java泛型和C++模板类很像,两者都支持参数化类型的语言功能,具体细节如果以后遇到再来补充

可变参数

(之后遇到再详细写一下)
在这里插入图片描述

参考链接:
https://www.bilibili.com/video/BV17F411T7Ao?p=1&share_source=copy_web&vd_source=fa075f0e5dab81ef7c98b9eb4c47d9a7
https://www.runoob.com/java/java-tutorial.html


http://chatgpt.dhexx.cn/article/WbDTCMMt.shtml

相关文章

C#的泛型方法

在 C# 语言中泛型方法是指通过泛型来约束方法中的参数类型&#xff0c;也可以理解为对数据类型设 置了参数。 如果没有泛型&#xff0c;每次方法中的参数类型都是固定的&#xff0c;不能随意更改。 在使用泛型后&#xff0c;方法中的数据类型则有指定的泛型来约束&#xff0c;…

java的泛型方法_Java中的泛型方法

泛型是什么意思在这就不多说了&#xff0c;而Java中泛型类的定义也比较简单&#xff0c;例如&#xff1a;public class Test{}。这样就定义了一个泛型类Test&#xff0c;在实例化该类时&#xff0c;必须指明泛型T的具体类型&#xff0c;例如&#xff1a;Test t new Test();&am…

泛型类和泛型方法

泛型方法是指调用该方法时才声明泛型类型。即不用和泛型类的泛型类型一致。 当为实例泛型方法时&#xff0c;可以声明类为泛型类或者将该方法声明为泛型方法。 当有静态泛型方法时&#xff0c;只能将该方法声明为泛型方法。 泛型类可以继承泛型类&#xff0c;也可以继承是具有泛…

Java泛型方法解惑

概述 什么是泛型&#xff1f; 泛型&#xff0c;是JDK5中引入的特性,它提供了编译时类型安全检测机制&#xff0c;该机制允许在编译时检测到非法的类型它的本质是参数化类型&#xff0c;也就是说所操作的数据类型被指定为一个参数。 提到参数&#xff0c;最熟悉的就是定义方法…

推荐一款超级好用的AI模型训练平台——Tesra超算网络!

2019独角兽企业重金招聘Python工程师标准>>> 作为一个刚接触AI行业的小萌新&#xff0c;好不容易做好了一个深度学习的模型&#xff0c;然后就兴冲冲的想要在我的电脑上做训练&#xff0c;自我感觉我的笔记本的性能还不错&#xff0c;然后loss下降很慢&#xff0c;再…

AI行业全面复苏,秋招AI岗位竞争激烈!Tesra超算网络助力找到合适的岗位!

2019独角兽企业重金招聘Python工程师标准>>> 随着各大互联网巨头纷纷下场&#xff0c;AI技术再经历过几次寒冬之后全面复苏&#xff0c;站在了时代的风口&#xff0c;迎来了爆发时期&#xff0c;成为了时代的趋势&#xff01;人工智能企业搞得轰轰烈烈势如破竹&…

大数据与AI时代,企业爆发之道?Tesra超算网络保驾护航!

2019独角兽企业重金招聘Python工程师标准>>> 现如今&#xff0c;人人都在谈论大数据&#xff0c;大数据究竟能够为企业带来什么呢&#xff1f;大数据又怎么才能够为企业带来最大的效益呢&#xff1f; 随着大数据时代的到来&#xff0c;根据数据分析的需求也由此诞生…

人工智能的春天来了!Tesra超算网络,助力AI开发!

2019独角兽企业重金招聘Python工程师标准>>> 我们必须承认&#xff0c;尽管人工智能技术的起源可以追溯到数十年前&#xff0c;不过受限于软硬件的发展&#xff0c;人工智能直到近几年才开始突飞猛进。其中算力是制约人工智能发展的首要因素&#xff0c;随着算力瓶颈…

ApacheCN×Tesra 免费算力申请活动

Tesra 超算网络是由 SAIC 基金会发起的&#xff0c;专为人工智能产业提供底层技术及 AI 资源共享服务的分布式"超算中心"。Tesra 超算网络基于 GPU 并行计算技术&#xff0c;通过整合全球分散的 GPU 算力资源&#xff0c;在建设人工智能基础设施的同时&#xff0c;为…

Tesra超算网络AI训练的使用流程

这篇文章将会为大家详细地介绍一下&#xff0c;Tesra超算网络AI训练的使用流程。 ​在使用Tesra超算网络进行AI模型训练前&#xff0c;需要完成官网注册和开发者钱包注册。 ​一&#xff1a;官网注册 ​Tesra超算网络的官网地址&#xff1a; http://supernet.tesra.io &…

Tesra平台训练数据(没有足够强大的显卡情况下使用云端跑代码)(一)

本地训练或者跑一些代码&#xff0c;比如用深度学习处理行人识别的视频&#xff0c;比较慢&#xff0c;又没有足够的钱换硬件啥的&#xff08;比如说博主&#xff0c;穷的一塌糊涂&#xff0c;没有钱配好的电脑&#xff09;&#xff0c;这时候考虑用一些算力平台来跑代码。 博主…

TESRA旗下InFlex计算平台使用流程

​这篇文章将会为大家详细地介绍一下&#xff0c;TESRA旗下InFlex计算平台的使用流程。 ​在使用InFlex计算平台训练前&#xff0c;需要完成**注册**。 ​一、注册 InFlex计算平台的官网地址&#xff1a; 注册登录 网址&#xff1a;https://www.tesra.cloud/ 使用手机号码注…

tesra内测阶段在线GPU的使用

官网是&#xff1a; https://www.tesra.org 注册个账号即可 &#xff03;&#xff03;&#xff03;&#xff03;&#xff03;&#xff03;&#xff03;&#xff03;&#xff03;&#xff03;&#xff03;&#xff03;&#xff03;&#xff03;算力券兑换&#xff03;&#xf…

2020年2月12日学习记录

今天学习了&#xff1a; 1.c#入门经典—成员定义和其他成员主题 2.计算机三级数据库技术—其他查询操作 3.计算机网络自顶向下第四章网络层第一遍—路由选择算法、路由选择层次 4.计算机组成课程第七章—操作码 地址码内容 5. 啊哈算法 快速排序实现 6.CSAPP英文版十页 —十…

10进制数转换为16位二进制数

写在前面&#xff1a; 题解是对具体题目的编程实现&#xff0c;不会具体讲解C语言语法。请先大致学习好语法&#xff0c;自己敲敲代码后再看题解&#xff08;上来就直接看题解的习惯不好哟~&#xff09;。在每一题的题解之前&#xff0c;会列出本题涉及到的语法知识供参考&…

vue 实现12个月的平铺式日历插件

实现的基本样式如下&#xff1a; 使用方法 1、安装插件 npm install vue-material-year-calendar --save2、导入插件 import YearCalendar from vue-material-year-calendar3、代码实现 <template><YearCalendarv-model"year":activeDates.sync"…

【LeetCode刷题】二月汇总篇

学习总结 文章目录 学习总结一、时间安排task01 数组task02 链表task03 栈task04 字符串task05 树task06 位运算task07 双指针task08 搜索task09 排序task10 动态规划task11 分治task12 哈希表 一、时间安排 阿里云天池leetcode训练营&#xff08;二月&#xff09;。 task01 数…

2019年9月全国计算机二级准考证打印,2019年9月计算机二级准考证打印入口公布...

2019年下半年全国计算机考试已经进入紧张备考中&#xff0c;在9月21日正式开考&#xff0c;请考生提前打印准考证&#xff0c;目前各市的准考证打印网址开通&#xff0c;考生可以自行打印。如果是在报名点报名的考生&#xff0c;可在报名点领取&#xff0c;下面我们来看各省打印…

MODIS16天数据月合成/季合成

1.MRT重投影、转换格式 重投影后命名为MOD13Q1.A2019129.250m_16_days_NDVI.tif 2.重命名 5月单独一期&#xff0c;即序号为129的一期。&#xff08;欢迎探讨&#xff09; 首先去掉前面的MOD13Q1. 再将001.250替换为0101 将129.250替换为0501 得到A20200501_16_days_NDVI.ti…

plc里的二进制 用计算机,如何理解二进制和十六进制(电工入门PLC知识普及)...

如何理解二进制和十六进制(电工入门PLC知识普及)三菱PLC直观易懂&#xff0c;便于入门&#xff01;&#xff01;而欧系的西门子PLC太复杂&#xff0c;不适合入门&#xff01;&#xff01;这句话已经成了很多人的口头语&#xff0c;但是&#xff0c;到底是为什么呢&#xff1f;&…