Java泛型中 T 和 ? 傻傻分不清楚

1.定义:
JDK5.0后,Java提供了泛型。
泛型是一种在编译时提供类型安全的方式,允许程序员在定义类、接口和方法时使用类型参数。这样,可以在不损失类型安全的情况下,创建可重用的代码。
泛型有两种主要的使用形式:类型参数(如 T)和通配符(如 ?)。
T通常用作类型参数的占位符。比如:泛型方法的语法包括一个包含在尖括号内的类型参数列表,并将它置于方法的返回类型之前。
?通配符主要用于泛型方法的参数和泛型类的字段,以及泛型集合的声明中。

通配符分为3种,分别为:
1)上界通配符:List<? extends Number>
可以读取容器内的元素。由于容器的具体类型未知,如果往容器添加元素,无法确保添加进去的具体数据是该容器具体类型的子类还是父类,因此存在类型不安全问题,所以是不允许往容器里添加数据的。
2)无界通配符:List<?>
3)下界通配符:List<? super Number>
可以读取也可以写入元素。


2.使用范围:
1)T 用作声明类的类型参数、方法(包括静态泛型方法、非静态泛型方法、泛型构造函数,但类型参数仅限于方法内使用)的类型参数。
2)? 通配符用作 参数类型、字段类型、局部变量类型及返回类型。

通配符在PECS(Producer Extends Consumer Super)原则中非常有用,该原则指出当你从一个泛型集合中获取对象时(生产者),应该使用上界通配符,当你向泛型集合中插入对象时(消费者),应该使用下界通配符。
通配符,一般是用于定义一个引用变量,以便实现"多态"调用(非真正意义上的多态)。例如
//以下是正确的代码:
public static void main(String[] args) {
    List<String> sList = new ArrayList<String>();
    List<Integer> iList = new ArrayList<Integer>();
    sList.add("abc");
    iList.add(10000);
    dump(sList);
    dump(iList);
}
public static void dump(List<?> list) {
    for (Object o : list) {
        System.out.println(o);
    }
}


通常我们使用 ? 的时候并不知道也不关心这个时候的类型,只想使用其通用的方法,而且 ? 通配符是无法作用于声明类的类型参数,一般作用于方法和参数上。而 类型变量 T 在类定义时具有更广泛的应用。

在某些程度的使用上 ? 通配符与 T 参数类型是可以等效的,但是 T 参数类型并不支持下界限制, 即 T super AClass 而 通配符支持下界限制 ? super AClass,即:使用super限定父集的时候,T 不可以,? 可以。
T和?两者都可以通过extends来限定一个类型的子集,但是 T 可以 List<T extends Number & AInterface> 限定为多重限定,? 不可以。
使用T时,Java的类型参数支持多重限定,如 <T extends CharSequence & Comparable<T>,但如果类型参数中包含类,则需要将类参数类型写在最前面。

如果你想写一个通用的方法且该方法的逻辑不关心类型那么就用 ? 通配符来进行适配,如果你需要作用域类型(这可能在操作通用数组类型时更有用)或者声明类的类型参数时请使用 T 类型变量。

//以下是错误的用法(编译错误:通配符不能用在创建对象上):
ArrayList<?> list = new ArrayList<?>();
//以下是错误的用法(List<T>在实例化的时候T要替换成具体的类):
List<T> t = new ArrayList<T>();

类型参数T和通配符?可以混合使用,例如以下为一个接受泛型集合并返回其中最大元素的方法:
public static <T extends Comparable<T>> T max(Collection<? extends T> collection) {  
    T maxElement = null;  
    for (T element : collection) {  
        if (maxElement == null || element.compareTo(maxElement) > 0) {  
            maxElement = element;  
        }  
    }  
    return maxElement;  
}


3.总结:
当对通用的对象类型进行操作时,使用 Object的缺点为:无法对 Object 编译时进行检查,因为 Object 是所有类的父类。
? 表示了集合[所有Java类型,包括String,Integer,Character等系统定义的,或者用户定义的类型]这个整体;而 T 表示了集合[所有Java类型,包括String,Integer,Character等系统定义的,或者用户定义的类型]中的一个成员。

当Integer类是Number类的子类时,List<? extends Integer>是List<? extends Number>的子类,而List<Integer>不是List<Number>类的子类。
可以向 List<Object> 中插入 Object 对象或者其子类对象,但只能向 List<?> 中插入 null 值,因为List<?>无法确定插入的元素的类型,而null是所有类型的成员。
类型参数写成全大写的有意义的单词是更具可读性的方式。


致力于C、C++、Java、Kotlin、Android、Shell、JavaScript、TypeScript、Python等编程技术的技巧经验分享。

若作品对您有帮助,请关注、分享、点赞、收藏、在看、喜欢。您的支持是我们为您提供帮助的最大动力。

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

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

相关文章

linux学习:栈

目录 顺序栈 结构 初始化一个空顺序栈 压栈 出栈 例子 十进制转八进制 链式栈 管理结构体的定义 初始化 压栈 出栈 顺序栈 顺序栈的实现&#xff0c;主要就是定义一块连续的内存来存放这些栈元素&#xff0c;同时为了方便管理&#xff0c; 再定义一个整数变量来代表…

2024中国(宁波)国际宠物用品博览会

2024中国(宁波)国际宠物用品博览会 People&Pet Fair 2024 专注2B交易&#xff0c;关注人宠发展&#xff0c;它经济&#xff0c;势不可挡! 时间&#xff1a;2024年11月14-16日 地点&#xff1a;宁波国际会展中心 详询主办方陆先生 I38&#xff08;前三位&#xff09; …

水离子雾化壁炉与酒店大厅的氛围搭配

将水离子雾化壁炉与酒店大厅的氛围搭配是一个很好的主意&#xff0c;可以为大厅增添舒适、温馨的氛围&#xff0c;以下是一些建议&#xff1a; 迎宾区域&#xff1a;在酒店大厅的迎宾区域设置水离子雾化壁炉&#xff0c;作为客人抵达时的第一印象。壁炉的温馨效果可以让客人感到…

Java+BS +saas云HIS系统源码SpringBoot+itext + POI + ureport2数字化医院系统源码

JavaBS saas云HIS系统源码SpringBootitext POI ureport2数字化医院系统源码 医院云HIS系统是一种运用云计算、大数据、物联网等新兴信息技术的业务和技术平台。它按照现代医疗卫生管理要求&#xff0c;在特定区域内以数字化形式收集、存储、传递和处理医疗卫生行业的数据。通…

【应用】SpringBoot-自动配置原理

前言 本文简要介绍SpringBoot的自动配置原理。 本文讲述的SpringBoot版本为&#xff1a;3.1.2。 前置知识 在看原理介绍之前&#xff0c;需要知道Import注解的作用&#xff1a; 可以导入Configuration注解的配置类、声明Bean注解的bean方法&#xff1b;可以导入ImportSele…

异构超图嵌入的图分类 笔记

1 Title Heterogeneous Hypergraph Embedding for Graph Classification&#xff08;Xiangguo Sun , PictureHongzhi Yin , PictureBo Liu , PictureHongxu Chen , PictureJiuxin Cao , PictureYingxia Shao , PictureNguyen Quoc Viet Hung&#xff09;【WSDM 2021】 2 Co…

模拟移动端美团案例(react版)

文章目录 目录 概述 项目搭建 1.启动项目&#xff08;mock服务前端服务&#xff09; 2.使用Redux ToolTik(RTK)编写store(异步action) 3.组件触发action并渲染数据 一、渲染列表 ​编辑 二、tab切换类交互 三、添加购物车 四、统计区域功能实现 五、购物车列表功能实现 六、控制…

Leetcode算法训练日记 | day23

一、修剪二叉搜索树 1.题目 Leetcode&#xff1a;第 669 题 给你二叉搜索树的根节点 root &#xff0c;同时给定最小边界low 和最大边界 high。通过修剪二叉搜索树&#xff0c;使得所有节点的值在[low, high]中。修剪树 不应该 改变保留在树中的元素的相对结构 (即&#xff…

2024/4/2—力扣—最小高度树

代码实现&#xff1a; /*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*/ struct TreeNode* buildTree(int *nums, int l, int r) {if (l > r) {return NULL; // 递归出口}struct…

Cohere推出全新升级版RAG大型AI模型:支持中文,搭载1040亿参数,现开源其权重!

4月5日&#xff0c;知名类ChatGPT平台Cohere在其官方网站上发布了一款全新的模型——Command R。 据官方消息&#xff0c;Command R拥有1040亿个参数&#xff0c;并且支持包括英语、中文、法语、德语在内的10种语言。这一模型的显著特点之一在于其对内置的RAG&#xff08;检索增…

文件加密软件大全,按市场份额排名

文件加密软件大全&#xff0c;按市场份额排名 文件加密是一种保护数据安全的重要手段&#xff0c;通过使用特定的算法将明文文件转化为密文&#xff0c;以防止未经授权的访问、篡改或泄露&#xff0c;市场份额排名的八款软件你需要了解一下。 1、安企神软件 专注于加密和审计…

高阶流程图(SIPOC)

SIPOC高阶流程图是一种流程映射和改进方法&#xff0c;它使用可视化的方式描述一个或多个流程的输入和输出。SIPOC是五个单词的首字母缩写&#xff0c;分别代表供应商&#xff08;Suppliers&#xff09;、输入&#xff08;Inputs&#xff09;、过程&#xff08;Processes&#…

蓝牙app设计 (方案一)app inventor

app Inventor是一款谷歌公司开发的手机编程软件。 谷歌推出一款名叫Google App Inventor的工具软件, Google App Inventor用户能够通过该工具软件使用谷歌的Android系列软件自行研发适合手机使用的任意应用程序。 而且这款编程软件不一定非要是专业的研发人员,甚至根本不需要…

2024 年最新前端工程师使用 Webpack 模块打包工具详细教程(更新中)

概述 Webpack 模块打包工具 Webpack 是一个现代的静态模块打包工具&#xff0c;用于将前端应用程序的各种资源&#xff08;例如如&#xff1a;JavaScript、CSS、图片等&#xff09;视为模块&#xff0c;并将它们打包成可以在浏览器中运行的静态文件。它的主要功能包括模块打包…

CUDA 12.4文档3 内存层次异构变成计算能力

5.3 内存层次 Memory Hierarchy CUDA线程在执行过程中可能会访问多个内存空间的数据&#xff0c;如图6所示。每个线程都有自己的私有本地内存。 每个线程块都有一个对块内所有线程可见的共享内存&#xff0c;并且其生命周期与块相同。线程块集群中的线程块可以对彼此的共享内…

中颖51芯片学习5. 类EEPROM操作

中颖51芯片学习5. 类EEPROM操作 一、SH79F9476 Flash存储空间1. 特性2. 分区3. OP_EEPROMSIZE选项设置3. 编程接口4. 代码保护控制模式简介&#xff08;1&#xff09;**代码保护模式0&#xff1a;**&#xff08;2&#xff09;**代码保护模式1&#xff1a;**&#xff08;3&#…

ESXI 中安装 虚拟机 麒麟v10 操作系统

浏览器访问登录ESXI 上传镜像文件 创建新虚拟机 选择虚拟机名称和操作系统 选择存储 配置虚拟机 配置虚拟机 cpu 内存 硬盘 并选择虚拟机驱动 配置完成后&#xff0c;点击下一步&#xff0c;并点击完成。 开机 完成后选择该虚拟机&#xff0c;并打开电源 等待出现以下界面…

2023年通用人工智能AGI等级保护白皮书

今天分享的是人工智能专题系列深度研究报告&#xff1a;《人工智能专题&#xff1a;2023年通用人工智能AGI等级保护白皮书》。 通用人工智能发展现状 本章主要介绍通用人工智能的基本情况&#xff0c;包括其发展历史、现状以及组成架构等内容。本文还将通过从技术角度出发来分…

【复现】浙大恩特客户资源管理系统 SQL注入漏洞_71

目录 一.概述 二 .漏洞影响 三.漏洞复现 1. 漏洞一&#xff1a; 四.修复建议&#xff1a; 五. 搜索语法&#xff1a; 六.免责声明 一.概述 浙大恩特客户资源管理系统是一款针对企业客户资源管理的软件产品。该系统旨在帮助企业高效地管理和利用客户资源&#xff0c;提升…

Innodb架构解析

整体架构 通过《面试官&#xff1a;一条SQL是如何执行的&#xff1f;》我们了解了MySQL架构&#xff0c;下面我们看下Innodb架构。 innodb最早由Innobase Oy公司开发&#xff0c;5.5版本开始是MySQL默认存储引擎&#xff0c;该存储引擎是第一个完整支持ACID事务的MySQL存储引…