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. Xrm.Internal.openDialog打开对话框自定义页面

    在Dynamics CRM平台中使用自定义页面拓展功能实现有多种方式,比如嵌套iframe,比如直接打开一个新页面,再就是打开对话框了,对话框里为自定义页面. 调用方式很简单,先把自定义页面上传好后, ...

  2. Solution -「LOCAL」Minimal DFA

    \(\mathscr{Description}\)   Private link.   令 \(\Sigma=\{\texttt a,\texttt b\}\),对于所有形式语言 \(L\subset ...

  3. Linux系统用户登录命令行或执行命令显示日志文件异常-bash: /var/log/ 解决办法

    经常会遇到Linux系统用户登录命令行或执行命令显示日志文件异常,比如:-bash: /var/log/xxx_audit/xxx_audit.log: Permission denied 其实是说开 ...

  4. 2025春秋杯DAY2DAY3部分wp

    2025春秋杯DAY2DAY3部分wp DAY2 WEB easy_ser 源码如下 <?php //error_reporting(0); function PassWAF1($data){ ...

  5. dart子类的继承

    1 Dart中类的继承 1.子类使用extends关键字来继承父类 2.子类会继承父类里面可见的属性和方法,但是不会继承构造函数 3. 子类能够复写父类的方法 getter和setter方法 2Dar ...

  6. JMeter的CLI模式(非GUI模式)常用命令

    JMeter的CLI模式(非GUI模式)常用命令 Apache JMeter是一款强大的开源性能测试工具,它支持图形用户界面(GUI)模式和非图形用户界面(CLI,即Command Line Inte ...

  7. Q:批处理备份临时文件

    批处理:将本月临时文件移动到历史目录中 chcp 936 @echo off set month=%date:~2,2%%date:~5,2% set year=%date:~0,4% echo %y ...

  8. nmcli命令

    nmcli命令详解 nmcli命令是可以完成网卡上的所有配置,并可以写入配置文件中. 在NM里,有2个维度:连接(connection)和设备(device),这是多对一的关系.想给某个网卡配ip,首 ...

  9. mount命令及挂载本地yum源

    mount命令 mount [-t vfstype] [-o options] device dir 其中: 1.-t vfstype 指定文件系统的类型,通常不必指定.mount 会自动选择正确的类 ...

  10. AI 如何重塑劳动力市场:基于 Claude 数据的深度分析

    前言 本文翻译自 Anthropic 今天发布的 The Anthropic Economic Index ,经济指数报告,这份报告基于 Claude 的数据对目前的 AI 使用情况做了汇总. 引言 ...