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. 解决mapper重名问题

    问题 公司有一个集成开发平台,导入数据库表会自动生成实体类.mapper和xml等文件,这是一件很方便的事,可以省去很多没有技术性的重复工作. 但是最近我在使用这个平台的时候遇到了一个问题,那就是ma ...

  2. Solution -「AGC 031E」Snuke the Phantom Thief

    \(\mathscr{Description}\)   Link.   在一个网格图内有 \(n\) 个格子有正价值,给出四种限制:横 / 纵坐标不大于 / 不小于 \(a\) 的格子不能选超过 \( ...

  3. SpringBoot启动源码分析

  4. 微信小程序block的作用

    有了block标签过后,你就可以把if 或则 for 语句写在block标签里面; 这样就控制了这一块的逻辑. 个人建议是要是v-if和v-for的都可以写在block上: block并不是一个组件, ...

  5. HTML标签-form表单

    HTML标签-form表单 在Web开发中,HTML表单(form)是不可或缺的一部分,它承担着用户与Web服务器之间交互的重任.今天,我们就来详细探讨一下HTML中的form表单标签. 一.form ...

  6. 7.1 闲话-Erdős–Gallai 定理和哈基米算法

    Erdős–Gallai 定理 前几天考试有一个建出最大流模型,转为最小割,然后模拟最小割的套路. 这一个套路并不是少见的.在 Gale-Ryser 定理和 Erdős–Gallai 定理的证明都体现 ...

  7. DexExpress Wpf BackstageItemWithImage

    参考链接: https://docs.devexpress.com/WPF/DevExpress.Xpf.Ribbon.BackstageItemWithImage.GlyphStyle 设置 Bac ...

  8. 大量小文件不适合存储于HDFS的原因

    1.小文件过多,会过多占用namenode的内存,并浪费block. - 文件的元数据(包括文件被分成了哪些blocks,每个block存储在哪些服务器的哪个block块上),都是存储在namenod ...

  9. Ubuntu通过VMware虚拟机安装步骤

    1.下载Ubuntu系统镜像 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.这个错误需要BIOS CPU里面设置一下,具体问度娘. 18 ...

  10. 分布式锁—7.Curator的分布式锁

    大纲 1.Curator的可重入锁的源码 2.Curator的非可重入锁的源码 3.Curator的可重入读写锁的源码 4.Curator的MultiLock源码 5.Curator的Semaphor ...