Java基础二十七(泛型)
泛型
Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。
泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。
Java的泛型是伪泛型,这是因为Java在编译期间,所有的泛型信息都会被擦掉,这也就是通常所说类型擦除 。泛型擦除
泛型一般有三种使用方式:泛型类、泛型接口、泛型方法。
public class Type<E>{}
public interface Interface<E> {}
public <E> E test(E e) {return e;
}
<? extends T>和<? super T>的区别 【了解】
分两种情况:
1. 作为容器时 【了解】
<? extends T>
没有意义,只能存null
<? super T>
可以放它本身和其子类类型,可以存null
public static void main(String[] args) {SuperMan man = new SuperMan();Person p = new Person("", 1);Student s = new Student("", 1);List<? extends Person> list = new ArrayList();
// list.add(man);
// list.add(p);
// list.add(s);
// list.add(1);list.add(null);List<? super Person> list1 = new ArrayList();
// list1.add(new Object());
// list1.add(man);list1.add(p);list1.add(s);list1.add(null);
// list1.add(1);}
public class Person extends SuperMan implements Comparable{private String name;private int age;//省略部分代码}class Student extends Person{public Student(String name, int age) {super(name, age);}}class SuperMan {}
2. 作为方法参数时
<? extends T>
支持其本身类型及其子类类型,也就是设置上限。
<? super T>
支持本身类型及其父类类型,也就是设置下限。
public static void main(String[] args) {List<Object> listObj = new ArrayList();List<SuperMan> listMan = new ArrayList();List<Person> listPson = new ArrayList();List<Student> listStu = new ArrayList();// ? extends Person
// test(listObj);
// test(listMan);test(listPson);test(listStu);// ? super Persontest1(listObj);test1(listMan);test1(listPson);
// test1(listStu);}public static void test(List<? extends Person> list) {}public static void test1(List<? super Person> list) {}
常用的通配符为: T,E,K,V,?通配符介绍
?
表示不确定的 java 类型T
(type) 表示具体的一个java类型K V
(key value) 分别代表java键值中的Key ValueE
(element) 代表Element
泛型的使用限制
1. 无法使用基本数据类型
List<int> list = new ArrayList<>(); // 编译时错误
2. 无法创建泛型参数类型的实例
public <E> void test(E e) {E e1 = new E(); // 编译时错误
}
但是可以通过反射来创建对象
public <E> void test(E e) {E e1 = e.getClass().newInstance();// 正确
}
3. 不能为static
字段(属性)声明为泛型类型
class Test<T>{private static T name; // 编译错误private T age; // 正确
}
4. 无法使用泛型类型进行强制类型转换或者 instanceof
List<Integer> li = new ArrayList<>();
List<Number> ln = (List<Number>)li; //编译错误
除非使用无界符号(?
)才可以强制转换
List<?> li = new ArrayList<>();
List<Number> ln = (List<Number>)li;
// 或者
List<Integer> li = new ArrayList<>();
List<?> ln = (List<?>)li;
在某种情况下,编译器知道泛型类型始终有效并允许强制类型转换
List<String> li = new ArrayList<>();
ArrayList<String> ln = (ArrayList<String>)li;
instanceof
public <E> void test(List<E> list) {if(list instanceof ArrayList<String>) {} //编译错误
}
运行时是不跟踪参数类型的,所以无法区分泛型类型。可以使用无界符号
public <E> void test(List<E> list) {if(list instanceof ArrayList<?>) {} //正确
}
5. 无法创建泛型类型的数组
List<String>[] lists = new ArrayList<String>[2]; //编译时错误
将不同类型元素插入到数组中:
Object[] objs = new String[2];
objs[0] = "s";
objs[1] = 1; // java.lang.ArrayStoreException
使用集合进行相同的操作
Object[] obs = new List<String>[2]; // 编译错误
obs[0] = new ArrayList<String>();
obs[1] = new ArrayList<Integer>();
6. 无法创建、捕获或者抛出泛型类型异常
泛型不能直接或间接扩展Throwable
类。
class Ex<T> extends Exception{} // 编译错误
class Exc<T> extends Throwable{} // 编译错误
无法捕获泛型类型实例
public <T extends Exception> void test() {try {}catch(T t) { // 编译错误}
}
但是可以在throws
子句中出现
public <T extends Exception> void test() throws T{}
7. 泛型擦除到原生类型的方法无法重载
因为泛型擦除后,方法的签名一样。
public void test(List<String> list) {} //编译错误
public void test(List<Integer> list) {} // 编译错误
相关文章:
Java基础二十七(泛型)
泛型 Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。 泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。 Java的泛型是伪…...
Python入门教程36:urllib网页请求模块的用法
urllib是Python中的一个模块,它提供了一些函数和类,用于发送HTTP请求、处理URL编码、解析URL等操作。无需安装即可使用,包含了4个模块: #我的Python教程 #官方微信公众号:wdPythonrequest:它是最基本的htt…...
LeetCode 每日一题 2023/9/4-2023/9/10
记录了初步解题思路 以及本地实现代码;并不一定为最优 也希望大家能一起探讨 一起进步 目录 9/4 449. 序列化和反序列化二叉搜索树9/5 2605. 从两个数字数组里生成最小数字9/6 1123. 最深叶节点的最近公共祖先9/7 2594. 修车的最少时间9/8 2651. 计算列车到站时间9/…...

C# Onnx Yolov8 Seg 分割
效果 项目 代码 using Microsoft.ML.OnnxRuntime; using Microsoft.ML.OnnxRuntime.Tensors; using OpenCvSharp; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System…...

Postman接口测试流程
一、工具安装 ● 安装Postman有中文版和英文版,可以选择自己喜欢的版本即可。安装时重新选择一下安装路径(也可以默认路径),一直下一步安装完成即可。(本文档采用英文版本)安装文件网盘路径链接࿱…...

探索GreatADM:如何快速定义监控
引文 在数据库运维过程中,所使用的运维管理平台是否存在这样的问题: 1、默认监控粒度不够,业务需要更细颗粒度的监控数据。2、平台默认的监控命令不适合,需要调整阈值量身定制监控策略。3、不同类型的实例或组件需要有不同的监控重点,但管理平台监控固…...

C# 参数名加冒号,可以打乱参数顺序
今天看到Python有这种语法,参数名后面跟着等号写参数,联想到前几天用到的Serilog,好像有个参数名加冒号的写法,搜索了一下,果真有这种用法。 函数特别大的时候,用这种方法很直观,而且参数可以打…...

AVL树 模拟实现(插入)
目录 模拟插入节点 左单旋 右单旋 右左双旋 左右双旋 总结 实现 插入实现 左单旋实现 右单旋实现 右左双旋实现 左右双旋实现 AVL树 模拟实现(插入) AVL 树,是高度平衡二叉搜索树,其主要通过旋转来控制其左右子树的高…...
Java面试整理(三)《JavaSE》
反射机制(低) 在我刚开始学Java的时候,大家都很难理解反射这个概念,在实际开发中,虽然都有反射的踪影,但感觉自己又能理解是的。反射机制是指在程序运行时,对任意一个类都能获取其所有属性和方法,并且对任意一个对象都能调用其任意一个方法。 反射的步骤如下: 获取想要…...

LeetCode 1282. Group the People Given the Group Size They Belong To【哈希表】1267
本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止;由于LeetCode还在不断地创建新题,本系列的终止日期可能是永远。在这一系列刷题文章…...

Vue2项目练手——通用后台管理项目第八节
Vue2项目练手——通用后台管理项目 菜单权限功能tab.jsLogin.vueCommonAside.vuerouter/index.js 权限管理问题解决router/tab.jsCommonHeader.vuemain.js 菜单权限功能 不同的账号登录,会有不同的菜单权限通过url输入地址来显示页面对于菜单的数据在不同页面之间的…...

leetcode872. 叶子相似的树(java)
叶子相似的树 题目描述递归 题目描述 难度 - 简单 leetcode - 872. 叶子相似的树 请考虑一棵二叉树上所有的叶子,这些叶子的值按从左到右的顺序排列形成一个 叶值序列 。 举个例子,如上图所示,给定一棵叶值序列为 (6, 7, 4, 9, 8) 的树。 如果…...

【Linux从入门到精通】信号(初识信号 信号的产生)
本篇文章会对Linux下的信号进行详细解释。主要内容是什么是信号、信号的产生、核心转储等问题。希望本篇文章会对你有所帮助。 文章目录 引入 一、初识信号 1、1 生活中的信号 1、2 Linux 下的信号 1、3 信号进程所得的初识结论 二、信号的产生 2、1 用户通过终端输入产生信号 …...
Golang综合项目实战(一)
Golang综合项目实战(一) 01-项目简介02-项目架构、术语、运行结果03-创建并初始化项目04-创建用户模型和错误处理05-创建密码加密工具类06-保存密码之前的hooks07-创建用户名密码验证工具类08-用户数据库操作逻辑09-操作用户service10-创建商品分类模型…...
springmvc 获取项目中的所有请求路径
springboot/springmvc 获取项目中的所有请求路径 1. 编写业务代码 Autowiredprivate WebApplicationContext applicationContext;GetMapping("/getAllURL")public RestfulResult getAllURL() {// 获取springmvc处理器映射器组件对象 RequestMappingHandlerMapping无…...

【React学习】React高级特性
1. 函数式组件和类组件区别 函数式组件 函数式组件是一种简单的组件定义方式,它是一个以JavaScript函数为基础的组件。 可以把函数式组件理解为纯函数,它的输入为props,输出为JSX。函数式组件没有状态,也没有生命周期。 functio…...

如何在Windows系统搭建filebrowser私人网盘并实现在外网访问本地内网
Windows系统搭建网盘神器filebrowser结合内网穿透实现公网访问 文章目录 Windows系统搭建网盘神器filebrowser结合内网穿透实现公网访问前言1.下载安装File Browser2.启动访问File Browser3.安装cpolar内网穿透3.1 注册账号3.2 下载cpolar客户端3.3 登录cpolar web ui管理界面3…...
蓝桥杯官网练习题(算式900)
题目描述 本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。 小明的作业本上有道思考题: 看下面的算式: (□□□□-□□□□)*□□900其中的小方块代表 0 ~ 9 的数字,这 10 个方块刚好包含了…...
【C++从入门到精通】第1篇:C++基础知识(上)
文章目录 1.1 C语句和程序结构1.1.1 本篇介绍1.1.2 语句1.1.3 函数和主函数1.1.4 解析Hello world1.1.5 语法和语法错误1.1.6 练习时间 1.2 注释1.2.1 单行注释1.2.2 多行注释1.2.3 正确使用注释1.2.4 注释掉代码 1.3 对象和变量1.3.1 数据和值1.3.2 对象和变量1.3.3 变量实例化…...

liunx系统无sudo或管理员权限安装rar解压安装包
liunx无sudo权限安装rar解压安装包 (1)正常liunx安装rar(2)无sudo\root(管理员身份)时如何安装rar (1)正常liunx安装rar 1、下载安装包 WinRAR archiver, a powerful tool to process RAR and ZIP files (r…...

UE5 学习系列(二)用户操作界面及介绍
这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八
现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet,点击确认后如下提示 最终上报fail 解决方法 内核升级导致,需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...

微服务商城-商品微服务
数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...

WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成
厌倦手动写WordPress文章?AI自动生成,效率提升10倍! 支持多语言、自动配图、定时发布,让内容创作更轻松! AI内容生成 → 不想每天写文章?AI一键生成高质量内容!多语言支持 → 跨境电商必备&am…...
ip子接口配置及删除
配置永久生效的子接口,2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...
Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?
Redis 的发布订阅(Pub/Sub)模式与专业的 MQ(Message Queue)如 Kafka、RabbitMQ 进行比较,核心的权衡点在于:简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...

【Linux】Linux 系统默认的目录及作用说明
博主介绍:✌全网粉丝23W,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...

破解路内监管盲区:免布线低位视频桩重塑停车管理新标准
城市路内停车管理常因行道树遮挡、高位设备盲区等问题,导致车牌识别率低、逃费率高,传统模式在复杂路段束手无策。免布线低位视频桩凭借超低视角部署与智能算法,正成为破局关键。该设备安装于车位侧方0.5-0.7米高度,直接规避树枝遮…...
【SpringBoot自动化部署】
SpringBoot自动化部署方法 使用Jenkins进行持续集成与部署 Jenkins是最常用的自动化部署工具之一,能够实现代码拉取、构建、测试和部署的全流程自动化。 配置Jenkins任务时,需要添加Git仓库地址和凭证,设置构建触发器(如GitHub…...
Vue 模板语句的数据来源
🧩 Vue 模板语句的数据来源:全方位解析 Vue 模板(<template> 部分)中的表达式、指令绑定(如 v-bind, v-on)和插值({{ }})都在一个特定的作用域内求值。这个作用域由当前 组件…...