逸学java【初级菜鸟篇】9.4 泛型

hi,我是逸尘,一起学java吧


泛型概述

泛型是我们在定义某一个类型规格的时候使用的泛指,我们预先定义一个大方向,防止路线错误。

实质上是程序员定义的安全类型,Object是顶级父类,在没有泛型很多程序员为了使程序更通用,设计程序时通常传入值和返回值对设置Object为主,但是必须正确的使用实例,正确转回原来类型,比较不方便,所以java提供了泛型。

泛型标识是任意设置的(如果你想可以设置为YC都行)但是常见还是默认给予一些意义

  T :代表一般的任何类。
  E :代表 Element 元素的意思,或者 Exception 异常的意思。
  K :代表 Key 的意思。
  V :代表 Value 的意思,通常与 K 一起配合使用。
  S :代表 Subtype 的意思,文章后面部分会讲解示意。
泛型一般格式

类名<T> 

我们来看这样的一个情况

public void test() {ArrayList list = new ArrayList();list.add("aaa");list.add("bbb");list.add("ccc");for (int i = 0; i < list.size(); i++) {System.out.println((String)list.get(i));}
}

这代码代码是没有问题的,那么如果说我们将“ccc”改为111

述代码在编译时没有报错,但在运行时却抛出了一个 ClassCastException 异常,其原因是 Integer 对象不能强转为 String 类型。 

那么我们想提前知道错误,所以我们需要一个大方向,这个时候便可以使用泛型了。

泛型格式还可以声明多个类型

类<T1,T2>

泛型限制

也可以对泛型限制,这个主要是创建类时类型限制

class 类<T extends anyclass>

 extends就是继承,表示这个泛型必须继承anyclass这个接口或者类

还提供了一个通配符? 和上面的区别是?它是在创建泛类型对象时限制

”T“ 是一个形参,表示所有String类的派生类其中的 ”某一个类”,当使用的时候会被强转成传入的具体类型,而”?“是一个实参,表示所有String类的派生类的集合,可以理解为一个范围。

泛类型名称<? extends anyclass>

所以当使用泛型对象的时候,需要单独实例化

A<? extends List> a=null;

a=new A<ArrayList>();

a=new A<LinkedList>();

public class GenericType {public static void main(String[] args) {  ArrayList<Number> list01 = new ArrayList<Integer>();// 编译错误ArrayList<? extends Number> list02 = new ArrayList<Integer>();// 编译正确}  
}

 但是我们说了?理解为一个范围,它不可以具体化的,就是它的集合可能是 ArrayList< Integer > 集合,也可能是 ArrayList< Float > 集合,在不确定前不能放入

public class GenericType {public static void main(String[] args) {  ArrayList<? extends Number> list = new ArrayList<>();list.add(new Integer(1));// 编译错误list.add(new Float(1.0));// 编译错误}  
}

那么除了实例化以外还可以去放在方法的参数上

public void dosomething(A<?extend List> a )

那么它就可以限制dosomething()的方法的参数。

我们还需要注意一点,通配符声明的实例化对象不能加入新的信息。

package com.yd.yc;import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;public class TestOne {public static void main(String[] args) {ArrayList<String> one = new ArrayList<String>();one.add("yc");List<?> two=one;List<?> three=new LinkedList<Integer>();System.out.println(two.get(0));one.set(0,"you");//two.set((0,"your");)    使用通配符的就不能调用改变信息}}

类型擦除

最后我们强调一个问题

泛型信息只存在于代码编译阶段,在代码编译结束后,与泛型相关的信息会被擦除掉,专业术语叫做类型擦除。也就是说,成功编译过后的 class 文件中不包含任何泛型信息,泛型信息不会进入到运行时阶段

public class GenericType {public static void main(String[] args) {  ArrayList<String> arrayString = new ArrayList<String>();   ArrayList<Integer> arrayInteger = new ArrayList<Integer>();   System.out.println(arrayString.getClass() == arrayInteger.getClass());// true}  
}

我们会发现,泛类型不同的两个 ArrayList 集合,一个是 ArrayList< String>,只能存储字符串。一个是 ArrayList< Integer>,只能存储整型对象。我们通过 arrayString 对象和 arrayInteger 对象的 getClass() 方法获取它们的类信息并比较,发现结果为true。

我们反编译看看

我们在一开始检查以后,如果类型不匹配编译器就会直接报错 ,如果匹配,编译类型擦除,如果又需要什么操作,又找回信息,进行匹配(会强制转换),也就是在泛型信息被擦除后,若还需要使用到对象相关的泛型信息,编译器底层会自动进行类型转换(从原始类型转换为未擦除前的数据类型)。

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

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

相关文章

【iOS】知乎日报

文章目录 前言一、首页1.网络的异步请求2.避免同一网络请求执行多次3.下拉刷新与上拉加载的实现下拉刷新上拉加载 二、网页1.webView的实现2.webView的滑动加载3.网页与首页内容的同步更新 三、评论区Masonory实现行高自适应 四、收藏中心通过FMDB实现数据持久化1.创建或打开数…

京东内部员工,爆料工资与公积金收入!

精彩回顾&#xff1a;进了央企&#xff0c;拿了户口&#xff0c;却感觉被困住了。 每个企业都有它的一套规则&#xff0c;哪些人适合加薪&#xff0c;哪些人适合拿奖金&#xff0c;哪些人适合给股票期权等等。但是说实话&#xff0c;很多人都只能拿底薪&#xff0c;这些福利啥的…

2018-2022年富时罗素 ESG评分数据

2018-2022年富时罗素 ESG评分数据 1、时间&#xff1a;2018-2022年 2、指标&#xff1a;证券代码、证券简称、富时罗素ESG评分、 3、说明&#xff1a; 富时罗素ESG评级体系评估了中国大陆、香港、欧洲以及美国等市场上1800家中国上市企业股票&#xff0c;评估了7200多种证券…

详解深度学习中的图神经网络GNN

引言 图神经网络GNN是深度学习的一个分支。 深度学习的四个分支对应了四种常见的数据格式&#xff0c;前馈神经网络FNN处理表格数据&#xff0c;表格数据可以是特征向量&#xff0c;卷积神经网络CNN处理图像数据&#xff0c;循环神经网络RNN处理时序数据&#xff0c;图神经网…

CSGO游戏搬砖市场下跌分析,是跑还是入?

CSGO市场下跌分析&#xff0c;是跑还是入&#xff1f; 以下所有都是阿阳本人最近几年观察市场和踩坑的一点经验&#xff0c;由于篇幅不长所以肯定会很浅薄&#xff0c;大伙下嘴轻点 。 首先现在真的是CSGO市场最低点吗&#xff1f;后续还会跌吗&#xff1f;我们究竟是该继续观…

C++三大特性——继承

目录 一.继承的概念及定义 1.1继承的概念 1.2 继承定义 1.2.1定义格式 1.2.2继承关系和访问限定符​编辑 1.2.3继承基类成员访问方式的变化 二.基类和派生类对象赋值转换 三.继承中的作用域 四.派生类的默认成员函数 五.继承与友元 六.继承与静态成员 一.继承的概念及…

stable-diffusion官方版本地复现手册(2023年4月10日)

stable diffusion v1.4官方版&#xff08;CompVis&#xff09;本地复现手册 主页&#xff1a;https://github.com/wjxpro 邮箱&#xff1a;804359553qq.com 文章目录 **stable diffusion v1.4官方版&#xff08;CompVis&#xff09;本地复现手册**〇、说明环境 一、准备1. [s…

leetcode:环形链表的入环点

题目描述 题目链接:力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 题目分析 我们假设起点到环的入口点的距离是L&#xff0c;入口点到相遇点的距离是X&#xff0c;环的长度是C 那么画图我们可以得知&#xff1a; 从开始到相遇时slow走的距离是LX从…

HarmonyOS ArkTS HTTP数据请求(九)

1 概述 日常生活中我们使用应用程序看新闻、发送消息等&#xff0c;都需要连接到互联网&#xff0c;从服务端获取数据。例如&#xff0c;新闻应用可以从新闻服务器中获取最新的热点新闻&#xff0c;从而给用户打造更加丰富、更加实用的体验。 那么要实现这样一种能实时从服务…

B033-Servlet交互 JSP

目录 ServletServlet的三大职责跳转&#xff1a;请求转发和重定向请求转发重定向汇总请求转发与重定向的区别用请求转发和重定向完善登录 JSP第一个JSP概述注释设置创建JSP文件默认字符编码集 JSP的java代码书写JSP的原理三大指令九大内置对象改造动态web工程进行示例内置对象名…

猫罐头多久喂一次?好用的猫罐头牌子推荐

猫爱吃猫罐头&#xff0c;包含各种美味&#xff0c;提供营养和口感。但喂猫吃罐头需技巧和耐心&#xff0c;以确保猫健康快乐成长。 作为一个从业宠物营养师7年的人&#xff0c;可以说对于猫咪的食物很有研究和猫罐头品牌选购上&#xff0c;我有自己的见解。 一、猫罐头多久喂…

第四代智能井盖传感器:智能井盖位移监测

当城市道路上的井盖出现异常时&#xff0c;可能会导致突发的交通事故或人员受伤事件。而传统的井盖监测往往依靠人力进行巡查&#xff0c;这种方式可能会因为监测不及时或不准确而带来问题。但是现在有了智能井盖传感器&#xff0c;它们成为了城市地下生命线的守护者。这种智能…