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.mzph.cn/news/708345.shtml

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

相关文章

返回数据(返回视图所需要的数据)

在上篇文章中&#xff0c;小编带领大家了解到&#xff1a;返回静态数据-CSDN博客&#xff0c;但是&#xff0c;仅仅返回一个静态页面&#xff0c;对于静态页面的数据没正常返回&#xff01; 所以&#xff0c;本篇文章便讲述如何返回数据&#xff1f;&#xff1f; 还是先不管前…

从win11切换到ubuntu20的第1天

我不想做双系统&#xff0c;反正win11也没有意思&#xff0c;打游戏直接去网吧&#xff0c;所以电脑直接重装了ubuntu20&#xff0c;为什么不是ubuntu22&#xff1f;因为版本太新&#xff0c;很多东西不支持。为什么不装ubuntu18&#xff1f;因为我电脑装完了之后不支持外界显示…

敏捷开发最佳实践:质量维度实践案例之软硬一体持续交付

在过去的Top敏捷实践案例中&#xff0c;我们可以看到企业或团队在敏捷质量管理上的创新&#xff0c;包括场景化测试、迭代T1自动化覆盖、一套自动用例到处运行、用例持续运行可视化等&#xff0c;而这也进一步促进了价值流动。本文将继续给大家带来全新的质量维度实践案例&…

【MySQL】_外连接

目录 3.1 情况一&#xff1a;两个表数据一一对应 3.2 情况二&#xff1a;两个表数据并非一一对应 本专栏关于联合查询已建立相应库与表&#xff0c;原文链接如下&#xff1a; 【MySQL】_联合查询基础表-CSDN博客 内连接原文如下&#xff1a; 【MySQL】_内连接-CSDN博客 基…

react 路由的基本原理及实现

1. react 路由原理 不同路径渲染不同的组件 有两种实现方式 ● HasRouter 利用hash实现路由切换 ● BrowserRouter 实现h5 API实现路由切换 1. 1 HasRouter 利用hash 实现路由切换 1.2 BrowserRouter 利用h5 Api实现路由的切换 1.2.1 history HTML5规范给我们提供了一个…

Android studio (一) 新建一个Android项目 编程语言为Java

一、下载Android studio 下载 Android Studio 和应用工具 - Android 开发者 | Android Developers 这里我下载的是2023年的 二、新建项目 选择如下模板。 填写项目名、项目保存位置、编程语言、最低支持Android API的版本、打包编译模式 三、报错Connection refused: no …

GO语言学习笔记(与Java的比较学习)(四)

结构体 一个结构体&#xff08;struct&#xff09;就是一组字段&#xff08;field&#xff09;。 package main ​ import "fmt" ​ type Vertex struct {X intY int } ​ func main() {fmt.Println(Vertex{1, 2}) } 结构体中的字段用 . 访问 package main ​ im…

【GB28181】wvp-GB28181-pro快速适配 连接SQlite3数据库

引言 wvp最新项目支持mysql等数据库, 如果本地没有安装mysql等数据库,并想直接可以运行wvp项目,需要进行二次修改。 本文包含:WVP最新代码适配SQlite3数据库 运行平台:windows或linux 文章目录 一、为何使用SQlite二、配置修改2.1 添加SQlite3依赖2.2 修改SQlite3不支持的…

进程的通信以及信号的学习

一&#xff0c;进程的通信&#xff1a; 种类&#xff1a;1.管道 2.信号 3.消息队列 4.共享内存 5.信号灯 6.套接字 1.管道: 1.无名管道 无名管道只能用于具有亲缘关系的进程间通信 pipe int pipe(int pipefd[2]); 功能: 创建一个无名管道 …

Rust 交叉编译 macOS 为 Linux 和 Windows

文章目录 前言环境案例macOS 编译为 Linux 和 Windows 可用二进制程序编译为 Linux 平台编译为Windows平台 最后 前言 鉴于 rust 中文资料较少&#xff0c;遇到问题的解决方案更少。这里记录遇到的一些问题。 Rust 支持交叉编译&#xff0c;可以在 macOS 平台编译出 Linux 或者…

机器学习——CBOW基于矩阵(手动实操)

基于矩阵的CBOW基础算法&#xff0c;其实是负采样的前提算法。 主要是根据 预测准确率为22%左右 说实话。。。我已经很满意了&#xff0c;至少这个东西是可以去预测的&#xff0c;至于预测为什么不正确&#xff0c;我目前猜测主要还是跟词频有关。 在结果中&#xff0c;an…

uniapp:启动图 .9png 制作教程

1、工具安装&#xff1a;自行下载Android Studio 2、制作.9png 注意上图3条黑线的位置&#xff0c;意思是&#xff1a;标注黑线的位置可以进行缩放。 对其大多数启动图来说&#xff0c;标注以上3条黑线即可。

一周掌握【机器学习】入门知识

学习目标&#xff1a; 一周掌握 机器学习 入门知识 学习内容&#xff1a; 1.了解机器学习的基本概念&#xff1a; 阅读由 Keras 的创建者 Francois Chollet 编著的《使用 Python进行深度学习》。这本书从程序员的角度介绍了机器学习的基础知识。您可以阅读第 1-4 章&#xff…

ETH开源PPO算法学习

前言 项目地址&#xff1a;https://github.com/leggedrobotics/rsl_rl 项目简介&#xff1a;快速简单的强化学习算法实现&#xff0c;设计为完全在 GPU 上运行。这段代码是 NVIDIA Isaac GYM 提供的 rl-pytorch 的进化版。 下载源码&#xff0c;查看目录&#xff0c;整个项目…

创新之巅 健康之选 森歌集成灶智能水洗新揭秘

2024年2月27日&#xff0c;一场引领智能厨电风潮的盛会在杭州隆重召开。森歌集成灶以“勠力同心 共生共歌”为主题&#xff0c;成功举办了2024森歌智能厨电优秀经销商峰会。此次峰会上&#xff0c;森歌集成灶发布了令人瞩目的奥运冠军同款智能厨电新品——森歌鲸洗小灶Z60&…

前端架构: 脚手架之多package项目管理和架构

多package项目管理 1 &#xff09;多package项目管理概述 通常来说&#xff0c;当一个项目变大了以后&#xff0c;我们就要对这个项目进行拆分在前端当中&#xff0c;对于项目进行拆分的方式&#xff0c;通常把它称之为javascript包管理需要使用一个工具叫做 npm (Node Packag…

JS二进制文件转换:File、Blob、Base64、ArrayBuffer

类型转换 1. Blob、File → Base64 function fileToDataURL(file) {let reader new FileReader();reader.readAsDataURL(file);reader.onload function (e) {return reader.result;}; }2. Base64 → Blob、File // Base64 转为 Blob function dataURLToBlob(fileDataURL) …

【服务器磁盘清理技巧】

服务器磁盘空间的管理是一个非常重要的系统管理员工作。大量的日志文件、临时文件、备份文件等可能会迅速填满你的磁盘空间&#xff0c;导致应用无法正常运行。因此&#xff0c;磁盘空间的清理和管理就显得非常重要。 本文将介绍一些在Linux服务器上清理磁盘空间的基本技巧。 …

Java开发的核心模式 - MVC

文章目录 1、MVC设计模式2、Web开发本质3、服务器的性能瓶颈 1、MVC设计模式 MVC设计模式示意图 在整个Java学习之旅中&#xff0c;MVC&#xff08;Model-View-Controller&#xff09;设计模式无疑占据着极其重要的地位&#xff0c;堪称理解和掌握Java项目开发精髓的钥匙。如…

Python Pandas处理金额注意事项和案例

使用 Python 的 Pandas 库处理金额时&#xff0c;有几个注意事项可以帮助确保准确性和避免常见的问题&#xff1a; 注意事项 使用适当的数据类型: 金额通常应该使用定点数来表示&#xff0c;以避免浮点数运算中的舍入误差。可以使用 decimal.Decimal 类型来保持高精度。 避免…