1.泛型

2.泛型--统一数据类型

如下图,当我们在泛型中添加不同的数据类型,add方法需要的数据类型也随之改变

[1]



[2]

泛型--默认类型object

当我们不指定泛型时,泛型的默认类型为object,所以add方法可以存储任意数据类型

3.泛型--将运行期间错误提升到编译期

如下图,我们在集合中添加了一些元素,使用迭代器遍历集合,然后想调用length方法查看集合长度,发现报错

报错的原因,在迭代器获取元素的那一行,左边是父类引用object,右边是子类

编译期间先看父类有没有length,再调用子类逻辑,很明显object类是不存在length这个方法的,所以报错

解决的方法很简单,使用向下转型

接着,我们右键运行程序,控制台打印的都是2,没有问题

但是,在object类型向下转型为String时没有报错,是因为我们添加的都是字符串类型,如果集合中存储了其他数据呢?如下图

我们将集合的泛型删去,可以添加任意的数据类型变量,此时我们添加一个随机数对象,发现程序没有报错

此时,我们右键进行运行,控制台出现了类型转换异常

异常的原因也能想清楚,随机数对象不可以向下转型为字符串

我们仔细想想,如果我们在集合中加了String泛型,那这个异常还会保留到运行期吗?

添加了泛型后,便会在编译期间报错,完全到不了运行期

这就是泛型将运行期错误提升到了编译期

4.泛型的学习路径

常见的泛型标识符

泛型标识符就是<>里面的字母,当个提示来看,没什么特殊含义

泛型的学习路径中,我们还需要学习一点,如下图

1.泛型类:创建对象的时候指定泛型

集合中可以指定泛型,我们自己当然也可以指定泛型,如下图,我们自己写一个类然后指定一个泛型

但是指定了这个泛型有什么用呢?

--假如我们要写一个变量或是方法,但是当时没想到要用什么类型,就可以使用泛型,等到创建类的时候再进行具体类型指定

2.泛型方法

泛型方法分为两种,一种非静态,一种静态

它们指定泛型的时机,如下图

[1]非静态方法

我们刚才在说泛型类的时候就使用到了泛型方法中的非静态方法,比如setE

泛型类是什么泛型,非静态方法的泛型也就跟着是什么类型

[2]静态方法

如下图,我们写了一个方法,然后使用不同数据类型的数组进行调用

报错的原因很简单,其他两个数组的数据类型和方法形参类型不匹配,我们就会发现这个方法局限性很大,不够灵活

那如果我们想让这个方法更加灵活该怎么做呢?--在方法中添加泛型

如图,我们在静态方法中指定泛型,这时方法就可以根据传入的数组来确定形参的类型,从而让该方法可以接收任意类型的数组

如上图,静态方法报错,这是因为静态方法不知道自己现在是什么类型

那之前说了方法跟着类走,我们试着在类上也指定个泛型能否有效呢?

如上图,静态方法还在报错,这是为什么呢?

想一想,类的泛型是什么时候确定的?--创建类的时候

而静态修饰的方法是优先于对象存在的,所以这个静态方法存在时,类还确定不到具体类型,当然不能根据类来指定静态方法的泛型了

既然不能跟着类混,那静态方法就要自己独自声明泛型,如下图,不再报错

静态方法确定泛型的时机:调用静态方法时

之前说过,泛型是只能指定引用数据类型,所以所有的基本数据类型都无法通过泛型修饰

3.泛型接口

1.泛型接口:在实现类实现接口时,指定泛型

假如,我们写了一个接口,里面的方法无法直接确定类型,就可以使用泛型,等到类实现接口时,再指定实际类型

2.泛型接口:实现类也声明泛型,等到创建对象时再确定实际类型

我们写了一个接口,无法确定具体类型,所以声明了一个接口,当实现类去实现泛型接口时,它也无法确定是什么类型,那就继续声明泛型



..

当创建这个实现类时,再确定具体类型

4.泛型通配符

当我们写了一个方法,想让这个方法能接收任意类型的集合时,我们就可以使用泛型通配符

如图,method既能接收Coder类型的集合,也可以接收Manager类型的集合

当method接收了集合后,遍历集合,取出存在集合里的coder和manager对象,可以看见接收它们的变量是object类型

此时,object接收了它们,如果要调用work方法会报错,因为object类中不存在,所以要向下转型

为了确保这两个对象都能使用,我们使用它们的父类employee做向下转型

右键运行,没有问题

但是,该代码还存在安全隐患,泛型通配符是任意类型的集合都可以接,这样就极容易和向下转型产生类型转换异常 如图

我们希望泛型通配符只接收employee这个体系里的对象,不是这个体系的对象不进行接收 如下图

此时,String类型的list3就无法传入method



泛型--java进阶day10的更多相关文章

  1. Java进阶(三十五)java int与integer的区别

    Java进阶(三十五)java int与Integer的区别 前言 int与Integer的区别从大的方面来说就是基本数据类型与其包装类的区别: int 是基本类型,直接存数值,而Integer是对象 ...

  2. Java进阶之路

    Java进阶之路——从初级程序员到架构师,从小工到专家. 怎样学习才能从一名Java初级程序员成长为一名合格的架构师,或者说一名合格的架构师应该有怎样的技术知识体系,这是不仅一个刚刚踏入职场的初级程序 ...

  3. Java进阶4表达式中的陷阱

    Java进阶4表达式中的陷阱 20131103 表达式是Java中最基本的组成单元,各种表达式是Java程序员最司空见惯的内容,Java中的表达式并不是十分的复杂,但是也有一些陷阱.例如当程序中使用算 ...

  4. (转)Java进阶java int与Integer的区别

    Java进阶java int与Integer的区别 前言 int与Integer的区别从大的方面来说就是基本数据类型与其包装类的区别: int 是基本类型,直接存数值,而Integer是对象,用一个引 ...

  5. Java 进阶 hello world! - 中级程序员之路

    Java 进阶 hello world! - 中级程序员之路 Java是一种跨平台的语言,号称:"一次编写,到处运行",在世界编程语言排行榜中稳居第二名(TIOBE index). ...

  6. Java进阶(五)Java I/O模型从BIO到NIO和Reactor模式

    原创文章,同步发自作者个人博客,http://www.jasongj.com/java/nio_reactor/ Java I/O模型 同步 vs. 异步 同步I/O 每个请求必须逐个地被处理,一个请 ...

  7. Java线程间通信方式剖析——Java进阶(四)

    原创文章,同步发自作者个人博客,转载请在文章开头处以超链接注明出处 http://www.jasongj.com/java/thread_communication/ CountDownLatch C ...

  8. Java进阶(三)多线程开发关键技术

    原创文章,同步发自作者个人博客,转载请务必以超链接形式在文章开头处注明出处http://www.jasongj.com/java/multi_thread/. sleep和wait到底什么区别 其实这 ...

  9. 当我们说线程安全时,到底在说什么——Java进阶系列(二)

    原创文章,同步发自作者个人博客,转载请以超链接形式在文章开头处注明出处http://www.jasongj.com/java/thread_safe/ 多线程编程中的三个核心概念 原子性 这一点,跟数 ...

  10. Java进阶03 IO基础

    链接地址:http://www.cnblogs.com/vamei/archive/2013/04/11/3000905.html 作者:Vamei 出处:http://www.cnblogs.com ...

随机推荐

  1. AI应用平台搭建之旅(上) - 框架篇(附:AICon大会阿里国际Agent应用平台分享)

    前言 LangEngine内源项目发起于阿里巴巴集团内部组织,LangEngine是类似LLM应用开发框架LangChain的纯Java版本.该框架现已正式对外开源:https://github.co ...

  2. Python连接远程设备

    import paramiko def content_ssh(): ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(parami ...

  3. Windows Server 2008R2服务器 IIS7.0 安装SSL证书并绑定https

    本例以阿里云服务器来解说,本服务器为Winodws Server 2008 R2(一般现在至少是2012版本了)默认IIS为7.0 第一步: 在阿里云上申请好证书并下载IIS版本,下载后上传到服务器中 ...

  4. python SQLAlchemy ORM——从零开始学习03 如何针对数据库信息进行排序

    03 如何进行排序 3-1准备工作: 因为要排序,所以需要随机多谢数据,model见后文.也需要random进行随机 from model import User, Engine from sqlal ...

  5. CSP-2024 初赛游记

    啊. \(\texttt{day}\) \(-4000\) 到重庆( \(\texttt{day}\) $ -3999$ ~ \(-7\) 文化课.文化课.OI.OI.自习.自习.模拟.模拟.挂分.挂 ...

  6. C# 调用FFmpeg 合并视频和音频

    C#修改环境变量: string pathStr = System.Environment.GetEnvironmentVariable("Path", EnvironmentVa ...

  7. 深入理解第三范式(3NF):数据库设计中的重要性与实践

    title: 深入理解第三范式(3NF):数据库设计中的重要性与实践 date: 2025/1/17 updated: 2025/1/17 author: cmdragon excerpt: 在数据库 ...

  8. 图解ArrayList源码

    初始化数组长度为空时, 懒加载 add方法 初始无参构造器 第一次添加 public boolean add(E e) {    // 确定容量 动态扩容 size 初始 0    ensureCap ...

  9. Pinely Round 4 (Div. 1 + Div. 2)

    题目链接:Pinely Round 4 (Div. 1 + Div. 2) 总结:被B卡了一年. A. Maximize the Last Element tag:模拟 Description:给定一 ...

  10. 2024 MWC上海,“翼”彩纷呈!

    2024年6月26日,2024世界移动通信大会上海(简称"MWC上海")盛大开幕.围绕"未来先行"主题,来自全球的产业.技术和社区等各界代表齐聚一堂,共话产业高 ...