简单了解java中的泛型

泛型

1、泛型含义

泛型是一种类型参数,专门用来保存类型用的。

例如ArrayList,这个E就是所谓的泛型了。使用ArrayList时,只要给E指定某一个类型,里面所有用到泛型的地方都会被指定对应的类型。

2、使用泛型的好处

不用泛型带来的问题

集合若不指定泛型,默认就是Object。存储的元素类型自动提升为Object类型,获取元素时得到的都是Object,若要调用特有的方法需要转型,这样会给变成带来很多麻烦。

使用泛型带来的好处

可以在编译时对类型做出判断,不免不必要的类型转换操作,精简代码,也避免了因为类型转换导致的错误。

注意:泛型在代码运行时,泛型会被擦除,我们可以实现在代码运行过程中添加其他类型的数据到集合中,所以泛型是使用在编写时期的技术方式。

3、泛型的使用

3.1、泛型类

  • 定义格式

    在类型名后面加上一对尖括号,里面定义泛型。一般使用一个英文大写字母,如果有多个泛型使用逗号隔开。

    public class 类名<泛型>{//类型内部,可以把泛型当作是某一种类型使用
    }
    
  • 泛型的确定

    当我们不确定类中的某个属性使用什么类型时,可以用泛型表示

    public class 类名<TG>{private TG 变量;
    }
    

    在我们创建泛型类对象时,明确泛型类型

    泛型类<Double> 对象 = new 泛型类<Double>();
    //此时泛型类中的成员变量是Double类型
    
  • 代码示例

//当不确定类中成员变量使用什么类型时可以用泛型来表示
class TgClass<T>{private T demo;public T getDemo() {return demo;}public void setDemo(T demo) {this.demo = demo;}
}public class Demo1 {public static void main(String[] args) {//创建对象,指定泛型类型为DoubleTgClass<Double> d = new TgClass<Double>();d.setDemo(2319848.89901);System.out.println(d.getDemo());}
}

3.2、泛型接口

  • 定义格式

    在接口名后面加上一对尖括号,里面定义泛型。一般使用一个英文大写字母,如果有多个泛型使用逗号隔开。

    public interface 接口名<T>{}
    
  • 泛型确定

    当定义接口时,其内部方法中的参数或者返回值类型不确定时,就可以使用泛型代替了。

    比如这样

    public interface 泛型接口<T>{public void demo(T x);
    }
    

    可以在实现类,实现接口时,确定接口中的泛型的类型(情况一),如果实现类和接口不指定具体类型,继续使用泛型指定变成含有泛型的类使用(情况二)。

    比如这样

    //情况一
    public class 子类 implements 泛型接口<String>{public void demo(String x){}
    }//情况二
    public class 子类<T> implements 泛型接口<T>{//方法重写public void demo(T a){}
    }
    子类<String> 对象 = new 子类<>();//创建子类对象时明确泛型的类型
    
  • 代码示例

定义父接口

public interface Father<T> {public void play(T x);
}

情况一

public class SonImp1 implements Father<Integer>{@Overridepublic void play(Integer x) {System.out.println(x + "参数类型是Integer");}
}public class Test1 {public static void main(String[] args) {SonImp1 sonImp1 = new SonImp1();sonImp1.play(999);}
}

情况二

public class SonImp2<T> implements Father<T>{@Overridepublic void play(T x) {System.out.println(x + "参数类型是String");}
}public class test2 {public static void main(String[] args) {SonImp2<String> sonImp2 = new SonImp2<>();sonImp2.play("哈哈哈");}
}

3.3、泛型方法

  • 语法格式

    修饰符号 <泛型> 返回值类型 方法名(泛型 参数1, 泛型 参数2,...){//方法体
    }
    
  • 泛型确定

    如果当前类没有声明泛型类,但该方法中的方法参数或者方法返回值不确定时,可以使用泛型类

    public <T> void demo(T x, Ty){}
    

    调用含有泛型的方法时,传入的数据其类型就是泛型的类型

4、泛型通配符

4.1、泛型通配符介绍

当我们对泛型的类型确定不了了,而想要表达的是任意类型,可以使用泛型通配符给定。符号就是一个问号“?”,表示任意类型,用来给泛型指定的一种通配符。

4.2、泛型统配符使用

泛型统配符搭配集合使用一般在方法的参数中比较常见。

我们可以来个示例:

假如有一个Person父类

public class Person {public int age;public String name;
}

Person有两个子类Student和Teacher,这时候我们需要创建一个集合,向这个集合中添加指定元素类型,那么我们可以这样做

ArrayList<Student> array = new ArrayList<>();
ArrayList<Teacher> array = new ArrayList<>();

那还有什么方式向集合中添加指定元素类型呢?这时候,有人可能会联想到多态,那么我们是不是还可以这样

ArrayList<Person> array = new ArrayList<Student>();

很遗憾,java中是不允许这样做的,java中的泛型没有多态这个概念,正确的做法是这样

//使用通配符
ArrayList<?> array = new ArrayList<Student>();

这样做有什么好处嘞?我们试想,现在有两个方法如下

public static void demoStu(ArrayList<Student> array){}public static void demoStu(ArrayList<Teacher> array){}

假如两个方法中的操作相同,只是传递参数的类型有差别,这时候上面的代码就显得有些冗余了,那么这时候,统配符就可以解决此问题

public static void demoStu(ArrayList<?> array){}

这样做之后,无论我们传递的参数是ArrayList< Student>类型,还是ArrayList< Teacher>类型,方法都能接手参数,不会发生报错。

5、受限泛型

受限泛型是指,在使用通配符的过程中,对泛型做了约束,给泛型指定类型时,只能是某个类型父类型或者子类型。

5.1、泛型的下限

只能是某一类型,及其父类型,其他类型不支持。

<? super 类型><? super 最小类型>
//?可以是最小类型也可以是父类型

5.2、泛型的上限

只能是某一类型,及其子类型,其他类型不支持。

<? extends 类型><? extends 最大类型>
//?可以是最大类型,也可以是子类型

5.3、代码示例

4.2中的示例方法我们现在还能这样写

public static void demo(ArrayList<? extends Person> array){}

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

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

相关文章

基于协同过滤推荐的在线课程选修系统

基于协同过滤推荐的在线课程选修系统 demo 网站查看 http://course.qsxbc.com/all_course/ 点我查看 效果 功能 登录注册、点赞收藏、评分评论&#xff0c;课程推荐&#xff0c;热门课程&#xff0c;个人中心&#xff0c;可视化&#xff0c;后台管理&#xff0c;课程选修 …

python文件:py,ipynb, pyi, pyc, pyd, pyo都是什么文件?

1、Python文件类型介绍 &#x1f4c1; 1.1 .py 文件&#xff1a;源代码基础 .py 文件是 Python 最基本的源代码文件格式&#xff0c;用于存储纯文本形式的 Python 代码。它是开发者编写程序的主要场所&#xff0c;包含函数、类、变量定义以及执行逻辑。Python 解释器直接读取…

Linux 命令 `db_hotbackup` 详解

Linux 命令 db_hotbackup 详解 在数据库管理领域&#xff0c;特别是在处理像Berkeley DB这样的数据库时&#xff0c;数据的备份和恢复是至关重要的一环。db_hotbackup 是Berkeley DB提供的一个实用工具&#xff0c;用于在数据库运行时进行热备份&#xff08;hot backup&#x…

高考后的职业规划:学习LabVIEW开发前景广阔

在今天的高考后&#xff0c;选择学习LabVIEW开发为未来职业规划将大有可为。LabVIEW以其图形化编程、强大的数据处理和硬件集成功能&#xff0c;广泛应用于工程、科研、自动化测试等领域。掌握LabVIEW开发技能&#xff0c;不仅就业前景广阔&#xff0c;还能参与前沿技术应用&am…

SQL进阶day10————多表查询

目录 1嵌套子查询 1.1月均完成试卷数不小于3的用户爱作答的类别 1.2月均完成试卷数不小于3的用户爱作答的类别 ​编辑1.3 作答试卷得分大于过80的人的用户等级分布 2合并查询 2.1每个题目和每份试卷被作答的人数和次数 2.2分别满足两个活动的人 3连接查询 3.1满足条件…

Linux 35.5 + JetPack v5.1.3@FC-Planner编译安装

Linux 35.5 JetPack v5.1.3FC-Planner编译安装 1. 源由2. 编译&安装Step 1&#xff1a;依赖库安装Step 2&#xff1a;克隆工程Step 3&#xff1a;编译工程Step 4&#xff1a;LKH编译Step 5&#xff1a;安装工程 3. 问题汇总3.1 Killed signal terminated program cc1plus3…

【Unity】 HTFramework框架(五十一)代码片段执行器

更新日期&#xff1a;2024年6月8日。 Github源码&#xff1a;[点我获取源码] Gitee源码&#xff1a;[点我获取源码] 索引 Code Snippet Executer 代码片段执行器使用 Code Snippet Executer打开 Code Snippet Executer动态执行&#xff08;代码片段&#xff09;静态执行&#x…

MySQL——C语言连接数据库

MySQL Connection ​ 连接数据库的客户端除了命令行式的还有图形化界面版本&#xff0c;网页版本&#xff0c;当然也包括语言级别的库或者是包&#xff0c;能够帮助我们直接连接数据库&#xff1b; 一、语言连接库下载 方式一&#xff1a;不建议使用&#xff0c;需要自己配置…

记录项目使用ts时引入js文件后导致项目运行空白问题

主要原因&#xff1a; 使用ts后开启了eslint检测&#xff0c;而js压缩文件引入的位置在eslint检测的文件内。导致eslint检测认为该文件为很大的文件&#xff0c;或eslint认为此文件内存在无法处理的语法结构等问题。 解决方法&#xff1a; 1、把文件移到eslint检测外的文件引入…

R语言数据探索和分析23-公共物品问卷分析

第一次实验使用最基本的公共物品游戏&#xff0c;不外加其他的treatment。班里的学生4人一组&#xff0c;一共44/411组。一共玩20个回合的公共物品游戏。每回合给15秒做决定的时间。第十回合后&#xff0c;给大家放一个几分钟的“爱心”视频&#xff08;链接如下&#xff09;&a…

物证管理系统|DW-S404实现物证科学化管理

随着社会的进步和科技的发展&#xff0c;信息化和数字化已经成为各个行业的必然趋势。在众多领域中&#xff0c;物证管理系统逐渐受到广泛的关注和应用。 物证是公安机关处理案件的关键凭证&#xff0c;针对过去物证管理分散、损毁遗失等严重问题&#xff0c;集驰电子JIONCH推…

0.3 数字电视(Digital television)简介

0.3 数字电视简介 数字电视是指采集、播出、传输、接收等环节中全面采用数字信号的电视系统。现代数字电视分辨率比模拟电视更高。通常使用宽屏&#xff08;宽高比为 16:9&#xff09;&#xff0c;与模拟电视的窄屏&#xff08;宽高比为 4:3&#xff09;形成鲜明对比。 数字电…

python : map list 切片 推导式

print 语句 # 打印 1 print(1) # 打印字符串 print(Test) # 拼接字符串 print(age: 12)map 函数 map 是 Python 中的一个内置函数&#xff0c;用于将一个函数应用到一个可迭代对象&#xff08;如列表、元组等&#xff09;的每一个元素&#xff0c;并返回一个迭代器&#xf…

红队神器Evil-winrm的使用

前言 Evil-winrm 工具最初是由 Hackplayers 团队开发的。开发该工具的目的是尽可能简化渗透测试&#xff0c;尤其是在 Microsoft Windows 环境中。 Evil-winrm 使用 PowerShell 远程协议 (PSRP)&#xff0c;且系统和网络管理员经常使用Windows Remote Management 协议进行上传和…

DDei在线设计器-DDeiCore-布局插件

DDei-Core-布局 如需了解详细的API教程以及参数说明&#xff0c;请参考DDei文档 标准布局 经典的框架结构布局&#xff0c;包含了顶部菜单栏、控件工具项、画布、属性面板和底部工具栏等功能面板&#xff0c;通过插件配置可以调整每个部分的顺序和内容。 效果截图 使用方式…

基于JSP技术的文物管理系统

你好呀&#xff0c;我是计算机学长猫哥&#xff01;如果有相关需求&#xff0c;文末可以找到我的联系方式。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;JSP技术 工具&#xff1a;IDEA/Eclipse、Navicat、Maven 系统展示 首页 管理员界面 用户前台…

C++基础与深度解析 | 元编程 | 元编程的编写方式 | 减少实例化技巧

文章目录 一、元编程的引入二、顺序、分支、循环代码的编写方式1.顺序代码的编写方式2.分支代码的编写方式3.循环代码的编写方式 三、减少实例化的技巧 这一章写的既浅又乱&#xff0c;为了知识的完整性先传上来&#xff0c;之后会重构 一、元编程的引入 泛型编程提供了一种方式…

【庞加莱几何-02】反演定理和证明

文章目录 一、说明二、 inversion和 reflection三、圆反演的定义四、广义的圆反演成圆 关键词&#xff1a;inversion、reflection 一、说明 这里是庞加莱几何的第二篇文章&#xff0c;是庞加莱基本几何属性的研究。本篇主要说清楚&#xff0c;什么是反演&#xff0c;在反演情况…

【面试官】知道synchronized锁升级吗

一座绵延在水上的美术馆——白鹭湾巧克力美术馆。它漂浮于绿水之上&#xff0c;宛如一条丝带轻盈地伸向远方 文章目录 可重入锁synchronized实现原理 synchronized缺点保存线程状态锁升级锁升级优缺点 1. 可重入锁 面试官&#xff1a;知道可重入锁有哪些吗? 可重入意味着获取…

HTTPS缺失?如何轻松解决IP地址访问时的“不安全”警告

一、问题现象 如果访问网站时出现以下任何一种情况&#xff0c;则说明该网站需要立即整改&#xff1a; 1.浏览器地址栏那里出现“不安全”字样&#xff1b; 2.小锁标志被红叉&#xff08;&#xff09;、斜线&#xff08;&#xff3c;&#xff09;等标志为不可用&#xff1b;…