16.泛型

news2024/11/15 16:56:26

泛型

一、什么是泛型

泛型的本质是参数化类型,即给类型指定一个参数,然后在使用时再指定此参数具体的值,那样这个类型就可以在使用时决定了。这种参数类型可以用在类、接口和方法中,分别被称为泛型类、泛型接口、泛型方法。

二、为什么需要泛型

Java中引入泛型最主要的目的是将类型检查工作提前到编译时期,将类型强转(cast)工作交给编译器,从而让你在编译时期就获得类型转换异常以及去掉源码中的类型强转代码。在没有泛型之前类型的检查和类型的强转都必须由我们程序员自己负责,一旦出现错误,直接导致项目崩溃,这是很严重的问题。在jdk1.5后,泛型应运而生。让你在设计API时可以指定类或方法支持泛型,这样我们使用API的时候也变得更为简洁,并得到了编译时期的语法检查。编译器在编译时期即可完成类型检查工作,并提出错误,这样就不会出现或是少数会出现类型问题导致项目崩溃。

三、泛型类

泛型作用的对象
泛型有三种使用方式,分别为:泛型类、泛型接口和泛型方法。
我们先介绍泛型类:在类的声明时指定参数,即构成了泛型类,例如下面代码中就指定T为类型参数,那么在这个类里面就可以使用这个类型了。

我们声明一个学生类,用来演示我们的泛型的作用:

//声明Student类时,同时约定数据类型T
public class Student<T>{

	//声明T类型的变量name
	public T name;
	
	//声明T类型的形参name为T类型的成员变量赋值
	public Student(T name) {
		this.name=name;
	}
	
	//声明T类型返回值的方法say
	public T say() {
		return name;
	}
}

在使用类时就可以传入相应的类型,构建不同类型的实例,传入String,Integer,Boolean3个类型:

public static void main(String[] args) {
		//泛型中只能使用引用数据类型
		Student<String> s1=new Student<String>("张三");
		Student<Integer> s2=new Student<Integer>(100);
		Student<Boolean> s3=new Student<Boolean>(true);
		
		System.out.println("Strng类型"+s1.name);
		System.out.println("Integer类型"+s2.name);
		System.out.println("Boolean类型"+s3.name);
	}

在这里插入图片描述
注意:泛型类型中只能使用引用数据类型,需要使用相应基本数据类型的包装类

四、泛型接口

泛型接口的定义,与类相似,类对象在实例化时确定泛型的具体类型,接口是在实现时确定泛型的具体类型。

public interface IStudentService<T> {

	public T say();
	
}
public class StudentService implements IStudentService<String>{

	@Override
	public String say() {
		// TODO Auto-generated method stub
		return null;
	}

}
public class StudentService_2 implements IStudentService<Integer>{

	@Override
	public Integer say() {
		// TODO Auto-generated method stub
		return null;
	}

}

五、泛型方法

定义泛型方法时,必须在返回值前边加一个< T >,来声明这是一个泛型方法,持有一个泛型T,然后才可以用泛型T作为方法的返回值。

public class Student<T> {

	public String name;
	
	public int age;
	
	public <E> E m(E e) {
		return e;
	}
	
	public <E> void m1(E e) {
		System.out.println(e);
	}
}

泛型类要在实例化的时候就指明类型,如果想换一种类型,不得不重新new一次,可能不够灵活;而泛型方法可以在调用的时候指明类型,更加灵活。

六、泛型通配符

泛型通配符是指使用"?"代表任意类型。T、E、K、V、?这些究竟是何方神圣?
其实这些全都属于java泛型的通配符,刚开始如果看到这么多通配符,可能觉得就够自己喝一壶的了,实际上这几个其实没啥区别,只不过是一个约定好的字母标识,不要害怕。其实也可以 使用大写字母A,B,C,D…X,Y,Z定义的,就都是泛型,把T换成A也一样,这里T只是名字上的意义而已。

  • E -
    Element(在集合中使用,因为集合中存放的是元素),E是对各方法中的泛型类型进行限制,以保证同一个对象调用不同的方法时,操作的类型必定是相同的。E可以用其它任意字母代替
  • T - Type(Java 类),T代表在调用时的指定类型。会进行类型推断
  • K - Key(键)
  • V - Value(值)
  • N - Number(数值类型)
  • ?- 表示不确定的java类型,是类型通配符,代表所有类型。?不会进行类型推断
	public void m(List<?> list) {
		return;
	}

但是说实话,单独一个"?"意义不大,因为大家可以看到,从集合中获取到的对象的类型是Object 类型的,也就只有那几个默认方法可调用,几乎没什么用。如果你想要使用传入的类型那就需要强制类型转换,这是我们接受不了的,不然为什么使用泛型。其真正强大之处是可以通过设置其上下限达到类型的灵活使用

  • 通配符上界

通配符上界使用<? extends T>的格式,意思是需要一个T类型或者T类型的子类,一般T类型都是一个具体的类型。

public void m(List<? extends T> list) {
		return;
	}

  • 通配符下界

通配符下界使用<? super T>的格式,意思是需要一个T类型或者T类型的父类,一般T类型都是一个具体的类型。

	public void m(List<? super T> list) {
		return;
	}

至于什么时候使用通配符上界,什么时候使用下界,在《Effective Java》中有很好的指导意见:即producer-extends,consumer-super. 换句话说,如果参数化类型表示一个生产者,就使用 <? extends T>;如果参数化类型表示一个消费者,就使用<? super T>。

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

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

相关文章

【ONE·C++ || 模板进阶】

总言 主要介绍模板相关内容&#xff1a;非类型模板参数、类模板特化、模板的分离编译。 文章目录 总言1、非类型模板参数1.1、主要介绍1.2、std::array 简要说明 2、模板的特化2.1、基本介绍2.2、函数模板特化2.3、类模板特化2.3.1、基本说明2.3.2、用途举例2.3.3、分类&#…

统信UOS 20 安装达梦数据库V8

统信UOS 20 安装达梦数据库V8 1、安装教程2、启动数据库实例服务失败解决方法3、使用dm管理工具连接数据库 1、安装教程 https://blog.csdn.net/OceanWaves1993/article/details/129936878 此教程进行到启动数据库实例步骤时 使用下面命令启动数据库实例服务时&#xff0c;报…

找高清图片素材,这8个网站就够了

相信很多设计师、自媒体都为找素材而烦恼&#xff0c;很多朋友不知道去哪里找图片素材&#xff0c;找到了版权还不明确&#xff0c;怕造成侵权&#xff0c;今天我就把我独家珍藏的8个图片素材网站分享给大家&#xff0c;免费下载&#xff0c;还可以商用&#xff0c;建议收藏起来…

APIs -- DOM浏览器

1. Window对象 1.1 BOM&#xff08;浏览器对象模型&#xff09; BOM(Browser Object Model)是浏览器对象模型 window对象是一个全局对象&#xff0c;也可以说是JavaScript中的顶级对象像document、alert()、console.log()这些都是window的属性&#xff0c;基本BOM的属性和方…

crackme例子1

样本 jadx 静态分析 其中v2为查v5表得到&#xff0c;v3为用户输入index 下面就分别分析这几个值是啥 abcdefghddddd 得到v5和v4 解压assets下abcdefghddddd 拖入010 editor查看&#xff0c;实际是一个带相关数据的png文件 v5为图片位置89473开始&#xff0c;长度768字节&am…

Web安全 SQL注入漏洞测试.(可以 防止恶意用户利用漏洞)

Web安全 SQL注入漏洞测试 SQL注入就是 有些恶意用户在提交查询请求的过程中 将SQL语句插入到请求内容中&#xff0c;同时程序的本身对用户输入的内容过于相信&#xff0c;没有对用户插入的SQL语句进行任何的过滤&#xff0c;从而直接被SQL语句直接被服务端执行&#xff0c;导致…

AutoSAR软件组件开发的两类工作流程(Matlab/Simulink)

目录 前面 自顶向下 导入arxml文件 生成模型框架 搭建算法模型 生成代码 自下向上 前面 如何在Matlab进行AutoSAR软件组件SWC的开发&#xff1f;也就是下图红框标识出来的部分。 常规的有两种方式自顶向下与自下而上&#xff1a; 从上往下&#xff1a;从软件组件描述文…

改bug神器ChatGPT AI测试将取代人工吗?

最近ChatGPT大火&#xff0c;各大论坛中都会出现它的关键词。 机器和人对话本不是什么新鲜事&#xff0c;而ChatGPT上线仅5天&#xff0c;用户数量就超百万&#xff0c;之所以能在短时间吸引到这么多用户尝鲜&#xff0c;是因为它比“人工智障”的AI前辈们聪明多了~ 玩了一会…

Vue 3 组件通信

本文采用<script setup />的写法&#xff0c;比options API更自由。那么我们就来说说以下七种组件通信方式&#xff1a; props emit v-model refs provide/inject eventBus vuex/pinia 举个例子 本文将使用下面的演示&#xff0c;如下图所示&#xff1a; 上图中…

继承下的类型转换

一、私有/保护继承下的向上类型转换 示例&#xff1a; 图中蓝色、黄色代码均不允许使用&#xff0c;原因是在私有继承下&#xff0c;派生类和基类的public接口完全不搭界&#xff08;所实现的功能没有重叠&#xff09;&#xff0c;因此不允许强制转换&#xff0c;也无任何意义…

04-waf绕过权限控制

WAF绕过-权限控制之代码混淆及行为造轮子 思维导图 后门工具介绍: 菜刀&#xff0c;蚁剑&#xff0c;冰蝎优缺点 菜刀&#xff1a;未更新状态&#xff0c;无插件&#xff0c;单向加密传输 蚁剑&#xff1a;更新状态&#xff0c;有插件&#xff0c;拓展性强&#xff0c;单向加…

远程虚拟桌面解决方案 OpenText™ Exceed™ TurboX(ETX)的优势有哪些?

远程虚拟桌面解决方案 OpenText™ Exceed™ TurboX&#xff08;ETX&#xff09;的优势有哪些&#xff1f; 为 Windows、Linux 和 UNIX 实施精益、经济高效的虚拟化&#xff1b;提供完整的远程 Windows 可用性&#xff1b;以类似本地的性能远程工作&#xff1b;安全地保护系统和…

【Redis7】 Redis7 哨兵(重点:哨兵运行流程和选举原理)

【大家好&#xff0c;我是爱干饭的猿&#xff0c;本文重点介绍Redis7 哨兵&#xff0c;重点&#xff1a;哨兵运行流程和选举原理。 后续会继续分享Redis7和其他重要知识点总结&#xff0c;如果喜欢这篇文章&#xff0c;点个赞&#x1f44d;&#xff0c;关注一下吧】 上一篇文…

第一章 webpack与构建发展简史

官方loader和插件 Loaders | webpack Plugins | webpack 为什么需要构建工具&#xff1f; 初识webpack webpack默认配置文件&#xff1a;webpack.config.js 可以通过webpack --config <config_file_name>指定配置文件 rules是个数组&#xff0c;一个打包配置可以有多…

基于凸集上投影(POCS)的聚类算法

POCS&#xff1a;Projections onto Convex Sets。在数学中&#xff0c;凸集是指其中任意两点间的线段均在该集合内的集合。而投影则是将某个点映射到另一个空间中的某个子空间上的操作。给定一个凸集合和一个点&#xff0c;可以通过找到该点在该凸集合上的投影来进行操作。该投…

Vue3图片预览(Image)

本图片预览组件主要包括以下功能&#xff1a; 展示图片时&#xff0c;可设置鼠标悬浮时的预览文本&#xff1b;图像无法加载时要显示的描述&#xff1b;自定义图像高度和宽度&#xff1b;设置图像如何适应容器高度和宽度&#xff08; fill(填充) | contain(等比缩放包含) | cov…

Node 06-包管理器

包管理工具 概念介绍 包是什么 『包』英文单词是 package &#xff0c;代表了一组特定功能的源码集合 包管理工具 管理『包』的应用软件&#xff0c;可以对「包」进行 下载安装 &#xff0c; 更新 &#xff0c; 删除&#xff0c; 上传等操作 借助包管理工具&#xff0c;可以…

ASEMI代理ADAU1701JSTZ-RL原装ADI车规级ADAU1701JSTZ-RL

编辑&#xff1a;ll ASEMI代理ADAU1701JSTZ-RL原装ADI车规级ADAU1701JSTZ-RL 型号&#xff1a;ADAU1701JSTZ-RL 品牌&#xff1a;ADI /亚德诺 封装&#xff1a;LQFP-48 批号&#xff1a;2023 安装类型&#xff1a;表面贴装型 引脚数量&#xff1a;48 类型&#xff1a;车…

向凯文·凯利提问:未来 5000 天我们将走向何处?

ChatGPT 的问世不禁让人遐想&#xff0c;接下来的 5000 天&#xff0c;将会发生什么事&#xff1f; 硅谷精神之父、世界互联网教父、《失控》《必然》的作者凯文凯利&#xff08;Kevin Kelly&#xff0c;以下简称 K.K.&#xff09;是这样预测的&#xff1a; 未来将会是一切都与…

WIFI-OmniPeek抓包

一、简介 有时候&#xff0c;我们需要抓取空口数据包来分析数据&#xff0c;此时就需要了解抓包软件如何使用。此时需要准备如下东西&#xff1a; SNIFFER&#xff1a;AC-12000 软件&#xff1a;OmniPeek 二&#xff1a;抓包 打开OmniPeek&#xff0c;新建捕获。 确认设备是否…