泛型的小结

文章目录

    • 什么是泛型
      • 泛型的相关概念
      • 泛型的作用
    • 泛型的使用
      • 泛型类语法
      • 泛型接口语法
      • 泛型方法语法
      • 泛型类的简单示例
      • 泛型接口的简单示例
      • 基于泛型的简单工厂方法
      • 泛型的上界与下界
    • 泛型的一些使用建议

什么是泛型

从JDK1.5开始引入泛型(generic)语法。对类型实现了参数化,编辑器根据上下文推导出实参类型,省略了实参类型的填写。

泛型的相关概念

术语准备

术语范例说明
参数化的类型List<String>表示List中元素的类型为String的容器
实际类型参数String泛型使用时的实参
泛型List<E>声明中具有一个或者多个类型参数的类或接口即泛型
形式类型参数E泛型声明中的形参
原生态类型ListRaw Type。即没有使用泛型,主要是为了兼容之前大量没有使用泛型的代码。
有限制类型参数<E extends Number>只接受 Number 的子类型或者 Number 本身作为 E 的类型实参。 范围上界
递归类型限制<T extends Comparable<T>>只接收实现了Comparable接口的。范围上界
有限制通配符类型List<? extends Number>只接受Number 或其子类类型。范围上界
无限制通配符类型List<?>可以接收任意类型
类型令牌String.class类的字面用在方法传递时的称呼
泛型方法static <E> List<E> aslist(E[] a)

泛型的编译时进行泛型擦除

在这里插入图片描述

程序编写的时候可以指定了泛型的元素类型为String类型,在编译的时候就变成Object。

擦除机制,在编译的过程中,将泛型转换(所有类型)为Object的机制。

泛型的作用

  • 加强类型安全检查:存放元素时,指明容器接收的对象的类型,让编译器进行类型安全检查
  • 无需手动进行类型转换,加快运行效率:取出元素时,无需手动进行类型转换,加快运行效率

在这里插入图片描述

进行类型安全检查之后,会在编译过程中反馈错误,减少运行时的错误。

泛型的使用

泛型常用的形参大写字母

  • E 表示 Element
  • K 表示 Key
  • V 表示 Value
  • N 表示 Number
  • T 表示 Type
  • S, U, V - 第二、第三、第四个类型

泛型类语法

class 类名称 <泛型标识、泛型标识,...> {private 泛型标识 变量名;......
}

泛型接口语法

interface 接口名称 <泛型标识,泛型标识,...>{泛型标识 方法名();
}      

泛型方法语法

方法限定符 <类型形参列表> 返回值类型 方法名称(形参列表){}

泛型类的简单示例

// 定义泛型类
public class GenericClass<T, N> {private T value1;private N value2;// 使用泛型类型作为形参类型和返回值public T getValue1() {return value1;}public void setValue1(T value1) {this.value1 = value1;}public N getValue2() {return value2;}public void setValue2(N value2) {this.value2 = value2;}public static void main(String[] args) {GenericClass<Integer, String> s1 = new GenericClass<>();s1.setValue1(1);s1.setValue2("XX");System.out.println(s1.getValue1() + ":" + s1.getValue2());GenericClass<Double, String> s2 = new GenericClass<>();s2.setValue1(1.1);s2.setValue2("YY");System.out.println(s2.getValue1() + ":" + s2.getValue2());}
}

泛型接口的简单示例

在接口中定义的类型参数可以在接口中当做类型使用,任何需要类型的地方都可以使用类型参数替代

// 定义泛型接口的类型参数为T
public interface Humans<T> {// 使用类型参数T作为方法参数类型void say(T t);// 使用类型参数T作为返回值类型T get();
}// 实现泛型接口的时候传入类型
public class BlackHuman implements Humans<BlackHuman> {public final String name;public BlackHuman(String name) {this.name = name;}@Overridepublic void say(BlackHuman yellowHuman) {System.out.println("我叫" + this.name + ",是黑种人");}@Overridepublic BlackHuman get() {return this;}
}public class Demo {public static void main(String[] args) {BlackHuman blackHuman = new BlackHuman("乔丹");blackHuman.say(blackHuman);System.out.println(blackHuman.get().name);}
}

基于泛型的简单工厂方法

public interface IService {String getServiceName();
}
public class MyService1 implements IService {@Overridepublic String getServiceName() {return "My Service1.";}
}
public class MyService2 implements IService {@Overridepublic String getServiceName() {return "My Service2.";}
}
package com.donny.demo;/*** @author 1792998761@qq.com* @description* @date 2023/10/8*/
public class ServiceFactory {private ServiceFactory() {}// 简单写法-通过额外参数表名服务public static IService getService(String key) {if ("MyService1".equals(key)) {return new MyService1();} else if ("MyService2".equals(key)) {return new MyService2();} else {return null;}}// 使用泛型方法public static <T> T getInstance(Class<T> className) {T result = null;try {result = className.newInstance();} catch (IllegalAccessException | InstantiationException e) {e.printStackTrace();}return result;}
}
public class Demo {public static void main(String[] args) {IService service1 = ServiceFactory.getInstance(MyService1.class);IService service2 = ServiceFactory.getInstance(MyService2.class);System.out.println(service1.getServiceName());System.out.println(service2.getServiceName());}
}

泛型的上界与下界

由于java中继承的特性

上界语法

class 类名称 <类型标识 extends 类型边界> {......
}

类型边界可以是类,也可以是接口。若类型边界是类,那么泛型中的类型只能接受边界类本身或其子类。若类型边界是接口,那么泛型中的类型必须实现了边界接口

// 传入的类型需要是Number或Number的子类
public interface Price<? extends Number> {
}// 传入的类型需要实现Comparable接口
public class ApplicableTransition<? extends Comparable<E>> {
}

下界语法

class 类名称 <类型标识 super 类型边界> {......
}

类型边界可以是类,也可以是接口。若类型边界是类,那么泛型中的类型只能接受边界类本身或其父类

泛型的一些使用建议

  1. 不使用原生态类型

  2. 消除非受检警告

    可以在类,方法,对象声明上增加注解来消除非受检个告警

    @SuppressWarnings("unchecked")
    
  3. 使用泛型时,列表优先于数组

  4. 利用有限通配符提升api的灵活性

  5. 优先考虑类型安全的异构容器

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

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

相关文章

一文看懂光模块的工作原理

你们好&#xff0c;我的网工朋友 光模块有很多类别&#xff0c;是我们经常要用到的PHY层器件。虽然封装&#xff0c;速率&#xff0c;传输距离有所不同&#xff0c;但是其内部组成基本是一致的。 以太网交换机常用的光模块有SFP&#xff0c;GBIC&#xff0c;XFP&#xff0c;X…

【Linux】 rm命令使用

作为一个程序员 我们经常用到rm -rf * 或者rm -rf XXX 。但是rm -rf 是什么意思不是很清楚&#xff0c;咱们一起来学习一下吧。 rm&#xff08;英文全拼&#xff1a;remove&#xff09;命令用于删除一个文件或者目录。 rm 命令 -Linux手册页 著者 由保罗鲁宾、大卫麦肯齐、理…

10.8队列安排,最少找字典次数,表达式转换与计算模拟(栈、队列)

队列安排1160 灵活的插入与删除 用队列实现的话&#xff0c;就是双端队列&#xff0c; 第一阶段是要找到对应编号的同学&#xff0c;然后根据p的取值决定是怎么插入 第二阶段也是要找到对应编号同学&#xff0c;之后就删除&#xff0c;如果找不到就返回 思路是这个思路&…

为什么团队需要实时协作?该如何实现?

协作是任何组织成功的关键部分&#xff0c;通过明确定义的愿景和使命并基于透明度和持续沟通来执行。 实时的协作是指员工之间就不同的项目、任务、文件或文档进行同步、无缝的互动和协作&#xff0c;他们几乎不受任何地理边界的限制&#xff0c;即时沟通和分享反馈、想法和信…

【AI视野·今日Robot 机器人论文速览 第四十七期】Wed, 4 Oct 2023

AI视野今日CS.Robotics 机器人学论文速览 Wed, 4 Oct 2023 Totally 40 papers &#x1f449;上期速览✈更多精彩请移步主页 Interesting: &#x1f4da;基于神经网络的多模态触觉感知, classification, position, posture, and force of the grasped object多模态形象的解耦(f…

从零开始的C++(七)

1.malloc、free和new、delete的区别&#xff1a; 1、.malloc、free是函数&#xff0c;new、delete是运算符。 2、malloc不会调用构造函数&#xff0c;new可以调用构造函数。 3、malloc开辟失败返回NULL&#xff0c;new失败会捕捉异常。 4、malloc不会自动计算类型大小&…

好奇喵 | PT(Private Tracker)——什么是P2P,什么是BT,啥子是PT?

前言 有时候会听到别人谈论pt&#xff0c;好奇猫病又犯了&#xff0c;啥子是pt&#xff1f; PT——你有pt吗&#xff1f;啥是pt&#xff1f; 从BT开始 BitTorrent是一种点对点&#xff08;P2P&#xff09;文件共享协议&#xff0c;用于高速下载和上传大型文件。它允许用户通…

钡铼BL124PN:简单快速转换Profinet到Ethernet/IP

钡铼技术BL124PN是一款高性能的Profinet转Ethernet/IP网关设备。该网关专为工业自动化领域设计&#xff0c;用于实现不同协议之间的互连和通信。BL124PN采用可靠稳定的硬件和先进的通信技术&#xff0c;具有以下主要特点&#xff1a; 协议转换能力&#xff1a;BL124PN能够将Pr…

暴力破解及验证码安全

1.暴力破解注意事项 1、破解前一定要有一个有郊的字典&#xff08;Top100 TOP2000 csdn QQ 163等密码&#xff09; https://www.bugku.com/mima/ 密码生成器 2、判断用户是否设置了复杂的密码 在注册页面注册一个,用简单密码看是否可以注册成功 3、网站是…

RabbitMQ-网页使用消息队列

1.使用消息队列 几种模式 从最简单的开始 添加完新的虚拟机可以看到&#xff0c;当前admin用户的主机访问权限中新增的刚添加的环境 1.1查看交换机 交换机列表中自动新增了刚创建好的虚拟主机相关的预设交换机。一共7个。前面两个 direct类型的交换机&#xff0c;一个是…

TDengine+OpenVINO+AIxBoard,助力时序数据分类

时间序列数据分析在工业&#xff0c;能源&#xff0c;医疗&#xff0c;交通&#xff0c;金融&#xff0c;零售等多个领域都有广泛应用。其中时间序列数据分类是分析时序数据的常见任务之一。本文将通过一个具体的案例&#xff0c;介绍 Intel 团队如何使用 TDengine 作为基础软件…

019 基于Spring Boot的教务管理系统、学生管理系统、课表查询系统

基于Spring Boot的教务管理系统、学生管理系统、课表查询系统 一、系统介绍 本作品主要实现了一个课表查询系统&#xff0c;采用了SSM&#xff08;Spring SpringMVC MyBatis&#xff09;的基础架构。 二、使用技术 spring-bootspring-MVCthymeleafmybatis-plusdruidLombo…

windows 远程连接 ubuntu桌面xrdp

更新 sudo apt update安装组件 sudo apt-get install xorg sudo apt-get install xserver-xorg-core sudo apt-get install xorgxrdp sudo apt install xfce4 xfce4-goodies xorg dbus-x11 x11-xserver-utilsxrdp sudo apt install xrdp sudo systemctl status xrdp sudo …

数据统计--图形报表--ApacheEcharts技术 --苍穹外卖day10

Apache Echarts 营业额统计 重点:已完成订单金额要排除其他状态的金额 根据时间选择区间 设计vo用于后端向前端传输数据,dto用于后端接收前端发送的数据 GetMapping("/turnoverStatistics")ApiOperation("营业额统计")public Result<TurnoverReportVO…

「专题速递」JPEG AI、端到端图像编码的标准化及产品落地、深度学习

从最初的追随者到如今的领跑者&#xff0c;中国的超高清视频编解码技术已经走过20年的漫长征程。从开始制定不同的视频编解码标准&#xff0c;如H.264/265、AV1、VVC、AVS&#xff0c;再到积极地探索基于AI的视频编码技术。视频编解码——这一将视频数据高效压缩、传输和解码还…

mybatis-plus 多数据源配置

1. 双数据库创建 两个数据库各有一张表 2. yml中配置双数据库 下面的配置来源于mybatis-plus官网 spring:datasource:dynamic:primary: master #设置默认的数据源或者数据源组,默认值即为masterstrict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,fal…

k8s-10 ingress-nginx 特性

TLS加密 创建证书 测试 auth认证 创建认证文件 rewrite重定向 进入域名 会自动重定向hostname.html 示例二&#xff1a; 测试 后面必须跟westos 这个关键字 canary金丝雀发布 基于header灰度 场景&#xff1a;版本的升级迭代&#xff0c;比如一个service 升级到另…

基于SpringBoot的房屋租赁管理系统的设计与实现

目录 前言 一、技术栈 二、系统功能介绍 屋主管理 房屋信息管理 房屋租赁公告 租用订单管理 房屋信息管理 保洁管理 房屋信息 租用订单管理 取消订单管理 三、核心代码 1、登录模块 2、文件上传模块 3、代码封装 前言 互联网发展至今&#xff0c;无论是其理论还是…

分布式数据库(林子雨慕课课程)

文章目录 4. 分布式数据库HBase4.1 HBase简介4.2 HBase数据模型4.3 HBase的实现原理4.4 HBase运行机制4.5 HBase的应用方案4.6 HBase安装和编程实战 4. 分布式数据库HBase 4.1 HBase简介 HBase是BigTable的开源实现 对于网页搜索主要分为两个阶段 1.建立整个网页索引&#xf…

【juc】future并行执行并获取返回值

目录 一、截图示例二、代码示例2.1 接口示例2.2 调用示例 一、截图示例 二、代码示例 2.1 接口示例 package com.learning.controller;import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.…