当前位置: 首页 > news >正文

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 Value
  • E (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 泛型&#xff08;generics&#xff09;是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制&#xff0c;该机制允许程序员在编译时检测到非法的类型。 泛型的本质是参数化类型&#xff0c;也就是说所操作的数据类型被指定为一个参数。 Java的泛型是伪…...

Python入门教程36:urllib网页请求模块的用法

urllib是Python中的一个模块&#xff0c;它提供了一些函数和类&#xff0c;用于发送HTTP请求、处理URL编码、解析URL等操作。无需安装即可使用&#xff0c;包含了4个模块&#xff1a; #我的Python教程 #官方微信公众号&#xff1a;wdPythonrequest&#xff1a;它是最基本的htt…...

LeetCode 每日一题 2023/9/4-2023/9/10

记录了初步解题思路 以及本地实现代码&#xff1b;并不一定为最优 也希望大家能一起探讨 一起进步 目录 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有中文版和英文版&#xff0c;可以选择自己喜欢的版本即可。安装时重新选择一下安装路径&#xff08;也可以默认路径&#xff09;&#xff0c;一直下一步安装完成即可。&#xff08;本文档采用英文版本&#xff09;安装文件网盘路径链接&#xff1…...

探索GreatADM:如何快速定义监控

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

C# 参数名加冒号,可以打乱参数顺序

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

AVL树 模拟实现(插入)

目录 模拟插入节点 左单旋 右单旋 右左双旋 左右双旋 总结 实现 插入实现 左单旋实现 右单旋实现 右左双旋实现 左右双旋实现 AVL树 模拟实现&#xff08;插入&#xff09; AVL 树&#xff0c;是高度平衡二叉搜索树&#xff0c;其主要通过旋转来控制其左右子树的高…...

Java面试整理(三)《JavaSE》

反射机制(低) 在我刚开始学Java的时候,大家都很难理解反射这个概念,在实际开发中,虽然都有反射的踪影,但感觉自己又能理解是的。反射机制是指在程序运行时,对任意一个类都能获取其所有属性和方法,并且对任意一个对象都能调用其任意一个方法。 反射的步骤如下: 获取想要…...

LeetCode 1282. Group the People Given the Group Size They Belong To【哈希表】1267

本文属于「征服LeetCode」系列文章之一&#xff0c;这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁&#xff0c;本系列将至少持续到刷完所有无锁题之日为止&#xff1b;由于LeetCode还在不断地创建新题&#xff0c;本系列的终止日期可能是永远。在这一系列刷题文章…...

Vue2项目练手——通用后台管理项目第八节

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

leetcode872. 叶子相似的树(java)

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

【Linux从入门到精通】信号(初识信号 信号的产生)

本篇文章会对Linux下的信号进行详细解释。主要内容是什么是信号、信号的产生、核心转储等问题。希望本篇文章会对你有所帮助。 文章目录 引入 一、初识信号 1、1 生活中的信号 1、2 Linux 下的信号 1、3 信号进程所得的初识结论 二、信号的产生 2、1 用户通过终端输入产生信号 …...

Golang综合项目实战(一)

Golang综合项目实战&#xff08;一&#xff09; 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. 函数式组件和类组件区别 函数式组件 函数式组件是一种简单的组件定义方式&#xff0c;它是一个以JavaScript函数为基础的组件。 可以把函数式组件理解为纯函数&#xff0c;它的输入为props&#xff0c;输出为JSX。函数式组件没有状态&#xff0c;也没有生命周期。 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)

题目描述 本题为填空题&#xff0c;只需要算出结果后&#xff0c;在代码中使用输出语句将所填结果输出即可。 小明的作业本上有道思考题&#xff1a; 看下面的算式&#xff1a; (□□□□-□□□□)*□□900其中的小方块代表 0 ~ 9 的数字&#xff0c;这 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解压安装包 &#xff08;1&#xff09;正常liunx安装rar&#xff08;2&#xff09;无sudo\root(管理员身份)时如何安装rar &#xff08;1&#xff09;正常liunx安装rar 1、下载安装包 WinRAR archiver, a powerful tool to process RAR and ZIP files (r…...

Miniconda环境迁移实战:如何将CentOS装好的Python环境打包到其他服务器?

Miniconda环境迁移实战&#xff1a;跨服务器Python环境无缝转移指南 当你在CentOS服务器上精心配置了一个完美的Python数据分析环境&#xff0c;却需要在另一台服务器上复现时&#xff0c;难道要重新经历一遍繁琐的安装过程&#xff1f;本文将揭示两种高效可靠的Miniconda环境迁…...

如何选择适合的单北斗变形监测一体机以提升基础设施安全?

本文将重点讨论如何选择适合的单北斗变形监测一体机&#xff0c;以增强基础设施的安全性。在当前基础设施建设快速发展的背景下&#xff0c;单北斗GNSS的应用显得尤为重要。通过深入理解单北斗变形监测的原理&#xff0c;用户能够更好地把握设备的核心优势&#xff0c;尤其是在…...

[路径保护]解决中文路径乱码:从名称错乱到Unicode支持的实践指南

[路径保护]解决中文路径乱码&#xff1a;从名称错乱到Unicode支持的实践指南 【免费下载链接】calibre-do-not-translate-my-path Switch my calibre library from ascii path to plain Unicode path. 将我的书库从拼音目录切换至非纯英文&#xff08;中文&#xff09;命名 项…...

OpenClaw自动化测试框架:百川2-13B驱动的CI/CD辅助方案

OpenClaw自动化测试框架&#xff1a;百川2-13B驱动的CI/CD辅助方案 1. 为什么选择OpenClaw做测试自动化 去年我在重构一个中型前端项目时&#xff0c;遇到了测试覆盖率不足的老问题。手动补测试用例不仅耗时&#xff0c;还经常遗漏边界条件。当我尝试用传统测试生成工具时&am…...

告别卡顿!用UE5关卡流送(Level Streaming)优化你的开放世界游戏性能

告别卡顿&#xff01;用UE5关卡流送&#xff08;Level Streaming&#xff09;优化你的开放世界游戏性能 当玩家在广袤的开放世界中自由探索时&#xff0c;没有什么比突然的加载卡顿或帧率骤降更能破坏沉浸感了。作为UE5开发者&#xff0c;我们常常面临一个两难选择&#xff1a;…...

毕业论文党必看!用MathType实现Word公式自动编号的3种隐藏技巧

毕业论文公式排版终极指南&#xff1a;MathType高效编号技巧全解析 在撰写理工科毕业论文或学术论文时&#xff0c;公式排版往往是让研究者头疼的环节。传统手动编号不仅效率低下&#xff0c;更会在修改文档时引发连锁灾难——一个公式的增删可能导致全篇编号错乱。MathType作为…...

FanControl深度应用指南:从噪音溯源到智能散热系统搭建

FanControl深度应用指南&#xff1a;从噪音溯源到智能散热系统搭建 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trending/f…...

FSearch:如何在Linux上实现秒级文件搜索?

FSearch&#xff1a;如何在Linux上实现秒级文件搜索&#xff1f; 【免费下载链接】fsearch A fast file search utility for Unix-like systems based on GTK3 项目地址: https://gitcode.com/gh_mirrors/fs/fsearch 还在为Linux系统中查找文件而烦恼吗&#xff1f;每次…...

Comsol流固耦合分析中的达西定律模块与固体力学模块的应用

Comsol流固耦合注浆及冒浆分析 采用其中达西定律模块及固体力学模块&#xff0c;通过建立质量源项、体荷载等实现上述考虑渗流场与结构场流固耦合理论方程的嵌入。在COMSOL里玩流固耦合就像给工程问题装了个动态CT扫描仪。最近在搞注浆冒浆模拟时发现&#xff0c;把达西渗流和固…...

3个步骤掌握FCEUX:开源NES模拟器的全方位应用指南

3个步骤掌握FCEUX&#xff1a;开源NES模拟器的全方位应用指南 【免费下载链接】fceux FCEUX, a NES Emulator 项目地址: https://gitcode.com/gh_mirrors/fc/fceux FCEUX是一款功能强大的开源NES模拟器&#xff08;任天堂娱乐系统游戏模拟工具&#xff09;&#xff0c;以…...