JAVA泛型浅析

Java范型generics,是JDK1.5引入的新特性,是一种编译时类型安全检测机制,可以在编译时检测到非法的类型。范型的本质是将类型参数化,将类型指定成一个参数。java中的集合就有使用,并且对外提供的三方库和SDK中使用也极为常见。
特点是运行效率高,在定义时不设限在使用时再写入具体类型。 定义泛型参数时还可以使用继承,例如 <T extends User> ,后面都可以使用User类或它的子类接收在必要的时再强转指定类型。

泛型只在编译期间生效,运行期泛型会被擦除,比如List<String> 和 List<Integer>的两个空集合,equals判断为true。
范型的参数只能是引用类型,不能是基本数据类型。

三种使用范围:范型类、范型接口、范型方法。

1、范型类:  用在构造方法在实例化的时候检测类型

范型的参数可以是系统定义的类也可以是自定义类;构造方法传入的实参类型需要与范型的参数类型相同,<T>  类型由调用方决定。

1.1 定义一个泛型类

public class GenericUser<T> {private T name;private T age;public GenericUser(T nameOrAge) {//这里为了学习总结,实际不会这样乱赋值this.name = nameOrAge;this.age = nameOrAge;}public GenericUser() {}public T getName(){return name;}public T getAge(){return age;}//注意:静态方法使用范型:必须将静态方法也定义成范型方法,否则报错。即使类已经定义了也会报错,必须在修饰符和返回值之间static之后加上这个范型private static <T> T getNameS(T t){return t;}}

1.2 使用泛型类

GenericUser<String> genericUser1 = new GenericUser<>("Tom");
Log.e(TAG, "onClick: name= "+genericUser1.getName() );
GenericUser<Integer> genericUser2 = new GenericUser<>(8);
Log.e(TAG, "onClick: age="+genericUser2.getAge() );
//todo 不是使用定义了范型的类就一定要传入范型,如果传了什么就用什么,如果不传就可以是任意类型。需要做类型判断
GenericUser genericUser3 = new GenericUser<>("随便写");
Log.e(TAG, "onClick: name="+genericUser3.getName()+"   age="+genericUser3.getAge());结果打印:
//2024-02-18 18:33:34.884 22735-22735/com.example.testdemo3 E/FanXingActivity: onClick: name= Tom
//2024-02-18 18:33:34.884 22735-22735/com.example.testdemo3 E/FanXingActivity: onClick: age=8
//2024-02-18 18:33:34.885 22735-22735/com.example.testdemo3 E/FanXingActivity: onClick: name=随便写   age=随便写

2、泛型方法

在方法调用时检测类型,在返回值类型之前的<T>是范型方法的象征,此处表示声明了一个范型T,范型数量也可以多个比如<T,E>;
下面getNanme1和getNanme2是泛型方法,但getNanme3方法不是范型方法它只是在形参中使用了范型而已。

private <T> T getName1(GenericUser<T> user){return user.getName();
}
//也有这种返回但不传入
private <T> T getName1(T str){GenericUser<T> genericUser = new GenericUser<>(str);Log.e(TAG, "getName1: name= "+genericUser.getAge() );return genericUser.getAge();
}private <T,E> T getName2(GenericUser<T> user){return user.getName();
}
//不是泛型方法
private String getName3(GenericUser<String> user){return user.getName();
}//范型方法也可以普通方法一样使用可变参数
private <T> void getName4(T...ts){for (T t : ts) {Log.e(TAG, "getName4: "+t );}
}

3、泛型接口:一般和范型类或方法搭配使用且与范型类用法类似

interface GenericInter<T> {T getNumber();
}

3.1 泛型类使用泛型接口

当实现范型接口的类不传范型实参:比如下面的也需要在类名增加GenericInterUser1<T>和接口一样的范型。

public class GenericInterUser1<T> implements GenericInter<T>{@Overridepublic T getNumber() {return null;}
}

如果当实现范型接口的类传入自己范型参数: 如GenericInterUser1不需要在类名加范型参数

public class GenericInterUser2 implements GenericInter<String>{private String number = "000001";@Overridepublic String getNumber() {return number;}
}

泛型的子类限制

public class GenericUserSun<T extends Number> extends GenericUser{private T age;public GenericUserSun(T age){super(age);this.age = age;}public T getAge() {return age;}
}

//上面案例GenericUserSun可以传入的泛型就有了限制,不是所有类型都可以,而必须是Number的子类,比如Integer、Byte、Short、Float等等。

注意:如果我们想写一个接口实现类做泛型参数也要使用<T extends 接口>和类一样 而不是<T implements 接口>,报错如下。

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

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

相关文章

顶会ICLR2024论文Time-LLM:基于大语言模型的时间序列预测

文青松 松鼠AI首席科学家、AI研究院负责人 美国佐治亚理工学院(Georgia Tech)电子与计算机工程博士&#xff0c;人工智能、决策智能和信号处理方向专家&#xff0c;在松鼠AI、阿里、Marvell等公司超10年的技术和管理经验&#xff0c;近100篇文章发表在人工智能相关的顶会与顶刊…

手撕Java集合之简易版Deque(LinkedList)

在目前&#xff0c;许多互联网公司的面试已经要求能手撕集合源码&#xff0c;集合源码本身算是源码里比较简单的一部分&#xff0c;但是要在面试极短的10来分钟内快速写出一个简易版的源码还是比较麻烦的&#xff0c;很容易出现各种小问题。所以在平时就要注重这方面的联系。 以…

React入门之React_渲染基础用法和class实例写法

渲染元素 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>04元素渲染</title><script src&…

深度测试:指定DoC ID对ES写入性能的影响

在[[使用python批量写入ES索引数据]]中已经介绍了如何批量写入ES数据。基于该流程实际测试一下指定文档ID对ES性能的影响有多大。 一句话版 指定ID比不指定ID的性能下降了63%&#xff0c;且加剧趋势。 以下是测评验证的细节。 百万数据量 索引默认使用1分片和1副本。 指定…

如何在aws服务器上部署mysql

在AWS服务器上部署 MySQL 数据库可以通过以下步骤完成&#xff1a; 启动 EC2 实例&#xff1a; 在 AWS 控制台中启动一个 EC2 实例&#xff0c;选择适合你需求的实例类型和配置。 安全组配置&#xff1a; 确保你的 EC2 实例的安全组配置允许来自你的 IP 地址的 MySQL 连接。默…

浅谈下一代防火墙与Web应用防火墙的区别

如今&#xff0c;Web应用程序变得越来越复杂&#xff0c;更是黑客非常感兴趣的目标。在谈到网络安全的话题时&#xff0c;我们总会讨论下一代防火墙与Web应用防火墙的区别。当已经拥有下一代防火墙&#xff08;NGFW&#xff09;时&#xff0c;为什么需要Web应用程序防火墙&…

基于springboot实现旅游路线规划系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现旅游路线规划系统演示 摘要 随着互联网的飞速发展以及旅游产业的逐渐升温&#xff0c;越来越多人通过互联网获取更多的旅游信息&#xff0c;包括参考旅游文纪等内容。通过参考旅游博主推荐的旅游景点和规划线路&#xff0c;参考计划着自己的旅行&#xff0c…

自然语言处理(NLP)中NER如何从JSON数据中提取实体词的有效信息

专栏集锦&#xff0c;大佬们可以收藏以备不时之需&#xff1a; Spring Cloud 专栏&#xff1a;http://t.csdnimg.cn/WDmJ9 Python 专栏&#xff1a;http://t.csdnimg.cn/hMwPR Redis 专栏&#xff1a;http://t.csdnimg.cn/Qq0Xc TensorFlow 专栏&#xff1a;http://t.csdni…

springboot项目中使用mybatis作为数据查询框架,如何实现查询sql的日志打印输出?

在Spring Boot项目中使用MyBatis作为数据查询框架时&#xff0c;可以通过配置日志记录器来实现SQL查询的日志打印输出。MyBatis支持多种日志框架&#xff0c;如SLF4J、Log4j2等。这里介绍几种常见的配置方法&#xff1a; 1. 使用application.properties或application.yml配置 …

高校宣讲会管理系统|基于Springboot的高校宣讲会管理系统设计与实现(源码+数据库+文档)

高校宣讲会管理系统目录 目录 基于Springboot的高校宣讲会管理系统设计与实现 一、前言 二、系统功能设计 1、学生信息管理 2、企业信息管理 3、宣讲会管理 4、公告信息管理 四、数据库设计 1、实体ER图 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 …

解码未来:Web3如何重塑我们的生活

随着技术的飞速发展&#xff0c;我们正处于数字化革命的时代&#xff0c;而Web3作为这一变革的重要组成部分&#xff0c;正在逐渐走进人们的视野。它不仅仅是互联网的下一代&#xff0c;更是一种全新的互联网范式&#xff0c;将为我们的生活带来彻底的改变。本文将深入探讨Web3…

【Linux】实时查看服务器信息

查看服务器CPU使用率 使用命令mpstat 1。这里的1表示每隔1秒更新一次CPU使用率。如果系统未安装mpstat&#xff0c;可以通过安装sysstat包来获取它。 在基于Debian的系统&#xff08;如Ubuntu&#xff09;上&#xff0c;使用命令&#xff1a; sudo apt-get update sudo apt-…