Java_Se 泛型

news2024/10/6 8:00:25

泛型基本概念:

      泛型是JDK5.0以后增加的新特性。泛型的本质就是“数据类型的参数化”,处理的数据类型不是固定的,而是可以作为参数传入。我们可以把“泛型”理解为数据类型的一个占位符(类似:形式参数),即告诉编译器,在调用泛型时必须传入实际类型

泛型的好处:

    在不使用泛型的情况下,我们可以使用Object类型来实现任意的参数类型,但是在使用时需要我们强制进行类型转换。这就要求程序员明确知道实际类型,不然可能引起类型转换错误;但是,在编译期我们无法识别这种错误,只能在运行期发现这种错误。使用泛型的好处就是可以在编译期就识别出这种错误,有了更好的安全性;同时,所有类型转换由编译器完成,在程序员看来都是自动转换的,提高了代码的可读性。

总结一下,就是使用泛型主要是两个好处:

1.代码可读性更好【不用强制转换】

2.程序更加安全【只要编译时期没有警告,运行时期就不会出现ClassCastException异常】

类型擦除编码时采用泛型写的类型参数,编译器会在编译时去掉,这称之为“类型擦除”。泛型主要用于编译阶段,编译后生成的字节码class文件不包含泛型中的类型信息,涉及类型转换仍然是普通的强制类型转换。类型参数在编译后会被替换成Object,运行时虚拟机并不知道泛型。泛型主要是方便了程序员的代码编写,以及更好的安全性检测。

泛型标记定义泛型时,一般采用几个标记:E、T、K、V、N、?。他们约定俗称的含义如下:

 

public class Test {
public static void main(String[] args) {//创建对象时,指定泛型具体类型。
       Generic<String>generic=newGeneric<>();
       generic.setFlag("admin");
       String flag=generic.getFlag();
       System.out.println(flag); //创建对象时,指定泛型具体类型。
       Generic<Integer>generic1=newGeneric<>();
       generic1.setFlag(100);
       Integer flag1=generic1.getFlag();
       System.out.println(flag1)
     }
}

泛型接口和泛型类的声明方式一致。泛型接口的使用语法结构

//在实现接口时传递具体数据类型
public class IgenericImpl implements 
Igeneric<String> {
   @Override
public String getName(Stringname) {
       return name;
    }
}
//在实现接口时仍然使用泛型作为数据类型
public class IGenericImpl2<T> implements IGeneric<T>{
   @Override
public T getName(T name) {
       return name;
   }
}

类上定义的泛型,在方法中也可以使用。但是,我们经常需要仅仅在某一个方法上使用泛型,这时候可以使用泛型方法。调用泛型方法时,不需要像泛型类那样告诉编译器是什么类型,编译器可以自动推断出类型

泛型方法的使用非静态方法非静态方法可以使用泛型类中所定义的泛型,也可以将泛型定义在方法上。

//无返回值方法
public <泛型标识符号> void getName (泛型标识符号 name){
}           //有返回值方法
public <泛型标识符号> 泛型标识符号 getName(泛型标识符号 name){
}
public class MethodGeneric {  
 public<T> void setName(T name){
       System.out.println(name);
}
   public <T> TgetAge(T age){
       return age;
    }
}

静态方法静态方法中使用泛型时有一种情况需要注意一下,那就是静态方法无法访问类上定义的泛型,所以必须要将泛型定义在方法上。

public class Test5 {
   public static void main(String[] args) {
       MethodGeneric methodGeneric=new MethodGeneric();
       String[] arr=new String[]{"a","b","c"};
       Integer[] arr2=new Integer[]{1,2,3};
       methodGeneric.method(arr);
       methodGeneric.method(arr2);
      }
}

无界通配符“?”表示类型通配符,用于代替具体的类型。它只能在“<>”中使用。可以解决当具体类型不确定的问题。

public class Generic<T> {
   private T  flag;
   public void setFlag(T flag){
       this.flag=flag;
}
   public T getFlag(){
       return this.flag;
  }
}

泛型主要用于编译阶段,编译后生成的字节码class文件不包含泛型中的类型信息。类型参数在编译后会被替换成Object,运行时虚拟机并不知道泛型。因此,使用泛型时,如下几种情况是错误的:

1基本类型不能用于泛型Test<int>t;这样写法是错误,我们可以使用对应的包装类Test<Integer>t;

2不能通过类型参数创建对象Telm=newT();运行时类型参数T会被替换成Object,无法创建T类型的对象,容易引起误解,java干脆禁止这种写法。

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

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

相关文章

如何搭建自己的域名邮箱服务器?Poste.io邮箱服务器搭建教程,Linux+Docker搭建邮件服务器的教程

Linux系统Docker搭建Poste.io电子邮件服务器&#xff0c;搭建属于自己的域名邮箱服务器&#xff0c;可以无限收发电子邮件&#xff08;Email&#xff09;&#xff01; 视频教程&#xff1a;https://www.bilibili.com/video/BV11p1mYaEpM/ 前言 什么是域名邮箱&#xff1f; …

【深度学习】— softmax回归、网络架构、softmax 运算、小批量样本的向量化、交叉熵

【深度学习】— softmax回归、网络架构、softmax 运算、小批量样本的向量化、交叉熵 3.4 Softmax 回归3.4.1 分类问题3.4.2 网络架构 3.4.3 全连接层的参数开销3.4.4 softmax 运算3.4.5 小批量样本的向量化3.4.6 损失函数对数似然softmax 的导数 3.4.7 信息论基础熵信息量重新审…

MySQL 和 Elasticsearch 的应用场景

MySQL 和 Elasticsearch 的应用场景 一、MySQL 关系型数据库管理系统&#xff0c;用于存储和管理结构化数据。 存储数据场景&#xff1a; 企业的财务系统、人力资源系统等&#xff0c;需要存储和管理具有明确关系的数据&#xff0c;如员工信息表、工资表等&#xff0c;这些表…

一阶差分模板的频率响应

一阶差分模板不同于二阶差分模板&#xff0c;它是一个奇对称的模板&#xff0c;傅里叶变换是纯虚数&#xff0c;无法用图形直接显示傅里叶变换&#xff0c;只能显示幅值谱。 冈萨雷斯的这个图我一直很好奇是怎么显示的&#xff0c;也没有坐标轴标出变量表示。 如今终于想明白…

基于Es的分词查询通过高亮效果实现前端高亮显示!!!!

引言&#xff1a; 经常我们在浏览器界面搜索关键词的时候&#xff0c;浏览器返回给我们的页面都是高亮显示关键词的效果&#xff0c; 如下&#xff1a; 我们要简单实现这个效果很简单&#xff0c;可以通过多种办法&#xff0c;这里通过Es 的高亮效果实现给我们关键字字段加自…

FRP搭建内网穿透:云服务端 + 家用Linux/Windows主机【2024】

介绍 FRP是一个可以自己搭建内网穿透服务的开源项目&#xff0c;开源地址直达&#xff1a; FRP-GitHub 实际上frp由两个程序组成 ①frps:在服务端运行的程序 ②frpc:在客户端运行的程序 运作方式示意图如下 服务端 因为服务上使用了1Panel面板&#xff0c;直接在应用商店安…

每日一题|134. 加油站|循环数组单次遍历

本题题目比较绕&#xff0c;理解了之后发现就是给一个一维数组表示余量&#xff0c;找出能够首尾相连且后构成每个位置处的累积和都是正数的索引。 首先&#xff0c;根据cost和gas相减&#xff0c;确定每个位置出发去下一个位置所剩余的gas。 这里可以直接统计全部的余量和&…

【德国EnMAP高光谱卫星】

德国EnMAP&#xff08;Environmental Mapping and Analysis Program&#xff09;高光谱卫星是德国在地球观测领域的一项重要成就&#xff0c;以下是对该卫星的详细介绍&#xff1a; 一、基本信息 发射时间&#xff1a;2022年4月1日研发机构&#xff1a;由德国航空航天中心&a…

【多模态项目实战】-模态表示:基于对应表示的跨模态检索(图文互搜)

【多模态项目实战】-模态表示&#xff1a;基于对应表示的跨模态检索 文章目录 【多模态项目实战】-模态表示&#xff1a;基于对应表示的跨模态检索1.任务介绍2.跨模态检索技术简介3.模型训练流程3.1读取数据1)下载数据集&#x1f680;2)整理数据集3)定义数据集类4)批量读取数据…

zutilo不支持zotero7,zotero7实现复制条目链接方法。

更新zotero7后原来的zutilo插件失效了&#xff0c;为其中复制条目链接这个功能修改了一个脚本&#xff0c;仅粘贴链接&#xff0c;无标题。 {"translatorID": "2de2b1a5-5725-494c-9224-5781cdf9b7ef","label": "Markdown ZotSelect"…

读数据湖仓08数据架构的演化

1. 数据目录 1.1. 需要将分析基础设施放置在数据目录(Data Catalogue)的结构中 1.1.1. 元数据 1.1.2. 数据模型 1.1.3. 本体 1.1.4. 分类标准 1.2. 数据目录类似于图书馆的图书检索目录 1.2.1. 先通过图书馆的图书检索目录进行查找&#xff0c;以便快速找到所需的图书 1…

《深度学习》OpenCV 摄像头OCR 过程及案例解析

目录 一、摄像头OCR 1、含义 2、一般操作步骤 1&#xff09;安装OpenCV库 2&#xff09;设置摄像头 3&#xff09;图像采集 4&#xff09;图像预处理 5&#xff09;文本识别 6&#xff09;文本处理 7&#xff09;结果显示 二、案例实现 1、定义展示图像函数 2、定…

CANoe_TestModule截图功能TestReportAddWindowCapture

前言 TestReportAddWindowCapture方法作为CAPL脚本中的一个重要功能&#xff0c;其能够将指定窗口的屏幕截图添加到测试报告中&#xff0c;对于记录和验证界面状态具有重要意义。本文将全面解析TestReportAddWindowCapture方法的使用方法、参数解释、示例应用以及注意事项&…

从介质失效看互联网时代的信息过载

来读一篇文章&#xff1a;90年代的硬盘已大规模变砖&#xff0c;没啥好担心的&#xff0c;好事。 结合我两年前的粗浅认知 互联网时代无信息&#xff0c;按照 “动” 的观念看&#xff0c;当信息越来越多&#xff0c;信息密度越来越大时&#xff0c;信息的寿命就会越来越短&am…

智谱AI开源CogView3及升级版,文生图技术新突破!

Ai 智能办公利器 - Ai-321.com 智谱AI近日震撼宣布&#xff0c;向公众开放其最新研发的CogView3及进阶版CogView-3Plus-3B&#xff0c;这两款模型无疑为文本转图像技术领域带来了革命性的突破。 人工智能 - Ai工具集 - 全球热门人工智能软件ai工具集合网站 CogView3作为首款运…

PMP--三模--解题--161-170

文章目录 10.沟通管理--沟通管理计划--沟通管理计划是项目管理计划的组成部分&#xff0c;描述将如何规划、结构化、执行与监督项目沟通&#xff0c;以提高沟通的有效性。该计划包括如下信息&#xff1a;干系人的沟通需求。--凡信息&#xff0c;找沟通。161、 [单选] 一家公司的…

【X线源】微焦点X射线源的基本原理

【X线源】微焦点X射线源的基本原理 1.背景2.原理 1.背景 1895年11月8日&#xff0c;德国物理学家威廉伦琴在研究阴极射线时偶然发现了X射线。当时&#xff0c;他注意到阴极射线管附近的荧光屏发出了光&#xff0c;即使它被纸板遮挡住。经过进一步实验&#xff0c;他意识到这种…

开源模型应用落地-模型微调-模型研制-模型训练(二)

一、前言 模型训练是深度学习领域中的关键环节。随着技术的发展,预训练模型的出现极大地改变了模型构建的格局。这些预训练模型在大规模数据集上进行了初步的学习,蕴含了丰富的通用知识。然而,不同的实际应用场景有着各自独特的需求。例如在医疗影像诊断领域,预训练模型可能…

Linux和指令初识

前言 Linux是我们在服务器中常用的操作系统&#xff0c;我们有必要对这个操作系统有足够的认识&#xff0c;并且能够使相关的指令操作。今天我们就来简单的认识一下这个操作的前世今生&#xff0c;并且介绍一些基础的指令操作 Linux的前世今生 要说Linux&#xff0c;还得从U…

GitLab flow工作流及其使用

问题背景 Git flow和Github flow及其问题 使用GitLab flow 目录 什么是GitLab工作流 功能分支 生产分支 使用GitLab flow环境分支 使用GitLab flow发布分支 使用GitLab flow合并/拉取请求 使用GitLab flow进行问题跟踪 链接和关闭合并请求中的问题 用rebase压缩提交…