泛型--java进阶day10
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的更多相关文章
- Java进阶(三十五)java int与integer的区别
Java进阶(三十五)java int与Integer的区别 前言 int与Integer的区别从大的方面来说就是基本数据类型与其包装类的区别: int 是基本类型,直接存数值,而Integer是对象 ...
- Java进阶之路
Java进阶之路——从初级程序员到架构师,从小工到专家. 怎样学习才能从一名Java初级程序员成长为一名合格的架构师,或者说一名合格的架构师应该有怎样的技术知识体系,这是不仅一个刚刚踏入职场的初级程序 ...
- Java进阶4表达式中的陷阱
Java进阶4表达式中的陷阱 20131103 表达式是Java中最基本的组成单元,各种表达式是Java程序员最司空见惯的内容,Java中的表达式并不是十分的复杂,但是也有一些陷阱.例如当程序中使用算 ...
- (转)Java进阶java int与Integer的区别
Java进阶java int与Integer的区别 前言 int与Integer的区别从大的方面来说就是基本数据类型与其包装类的区别: int 是基本类型,直接存数值,而Integer是对象,用一个引 ...
- Java 进阶 hello world! - 中级程序员之路
Java 进阶 hello world! - 中级程序员之路 Java是一种跨平台的语言,号称:"一次编写,到处运行",在世界编程语言排行榜中稳居第二名(TIOBE index). ...
- Java进阶(五)Java I/O模型从BIO到NIO和Reactor模式
原创文章,同步发自作者个人博客,http://www.jasongj.com/java/nio_reactor/ Java I/O模型 同步 vs. 异步 同步I/O 每个请求必须逐个地被处理,一个请 ...
- Java线程间通信方式剖析——Java进阶(四)
原创文章,同步发自作者个人博客,转载请在文章开头处以超链接注明出处 http://www.jasongj.com/java/thread_communication/ CountDownLatch C ...
- Java进阶(三)多线程开发关键技术
原创文章,同步发自作者个人博客,转载请务必以超链接形式在文章开头处注明出处http://www.jasongj.com/java/multi_thread/. sleep和wait到底什么区别 其实这 ...
- 当我们说线程安全时,到底在说什么——Java进阶系列(二)
原创文章,同步发自作者个人博客,转载请以超链接形式在文章开头处注明出处http://www.jasongj.com/java/thread_safe/ 多线程编程中的三个核心概念 原子性 这一点,跟数 ...
- Java进阶03 IO基础
链接地址:http://www.cnblogs.com/vamei/archive/2013/04/11/3000905.html 作者:Vamei 出处:http://www.cnblogs.com ...
随机推荐
- 解决mapper重名问题
问题 公司有一个集成开发平台,导入数据库表会自动生成实体类.mapper和xml等文件,这是一件很方便的事,可以省去很多没有技术性的重复工作. 但是最近我在使用这个平台的时候遇到了一个问题,那就是ma ...
- Solution -「AGC 031E」Snuke the Phantom Thief
\(\mathscr{Description}\) Link. 在一个网格图内有 \(n\) 个格子有正价值,给出四种限制:横 / 纵坐标不大于 / 不小于 \(a\) 的格子不能选超过 \( ...
- SpringBoot启动源码分析
- 微信小程序block的作用
有了block标签过后,你就可以把if 或则 for 语句写在block标签里面; 这样就控制了这一块的逻辑. 个人建议是要是v-if和v-for的都可以写在block上: block并不是一个组件, ...
- HTML标签-form表单
HTML标签-form表单 在Web开发中,HTML表单(form)是不可或缺的一部分,它承担着用户与Web服务器之间交互的重任.今天,我们就来详细探讨一下HTML中的form表单标签. 一.form ...
- 7.1 闲话-Erdős–Gallai 定理和哈基米算法
Erdős–Gallai 定理 前几天考试有一个建出最大流模型,转为最小割,然后模拟最小割的套路. 这一个套路并不是少见的.在 Gale-Ryser 定理和 Erdős–Gallai 定理的证明都体现 ...
- DexExpress Wpf BackstageItemWithImage
参考链接: https://docs.devexpress.com/WPF/DevExpress.Xpf.Ribbon.BackstageItemWithImage.GlyphStyle 设置 Bac ...
- 大量小文件不适合存储于HDFS的原因
1.小文件过多,会过多占用namenode的内存,并浪费block. - 文件的元数据(包括文件被分成了哪些blocks,每个block存储在哪些服务器的哪个block块上),都是存储在namenod ...
- Ubuntu通过VMware虚拟机安装步骤
1.下载Ubuntu系统镜像 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.这个错误需要BIOS CPU里面设置一下,具体问度娘. 18 ...
- 分布式锁—7.Curator的分布式锁
大纲 1.Curator的可重入锁的源码 2.Curator的非可重入锁的源码 3.Curator的可重入读写锁的源码 4.Curator的MultiLock源码 5.Curator的Semaphor ...