Java中泛型的?和T的区别

news2024/11/24 12:37:44

文章目录

  • 1、前言
    • 2、java中泛型?、T
      • 2.1、?、T的概念
      • 2.2、?、T的用法
        • 2.1.1、T用法
        • 2.1.2、?用法
      • 2.3、T、?在继承上的体现
      • 2.4、有限制通配符
        • 2.4.1、? extends A:
        • 2.4.2、? super A:
      • 2.5、无限制通配符和有限制通配符的数据读写问题
        • 2.5.1、无限制通配符读写
        • 2.5.2、有限制通配符读写
        • 1、? extends A:
        • 2、? super A:
    • 3、看下一些开源工具类中是如何使用

1、前言

关于java泛型中的T的区别之前一直停留在一些概念上,而并没有真正明白到底什么时候用,什么时候用T
并且之前虽然有写过抽象类,但一直用的是T、Q,没有用过,所以一直不明白到底怎么个用法,什么时候用。
但在这里还是得再提下T的概念。

2、java中泛型?、T

2.1、?、T的概念

T:代表一种类型。
:通配符,泛指所有的类型,是所有类型的父类。

2.2、?、T的用法

2.1.1、T用法

T:主要用于泛型类的定义泛型方法的定义,还有具体的变量的类型定义上。

  • 定义泛型类
//定一个动物类
class Animal<T>{}

  • 定义泛型方法
public <T> void eat(T[] a, Collection<T> c)

  • 修饰泛型类的属性成员:
class Animal<T>{
	T temp;
}

以上三种情况,在实际应用中,都指明了T,是一个具体的泛型类,都不能用代替。
因为?表示统配符,代表不是确定的类,表示任意类。

2.1.2、?用法

:一般是用于定义一个引用变量,以便实现“多态”调用(非真正意义上的多态)。

  • 定义为引用变量,可指向不同类型的变量

比如定义一个Animal的引用变量,不指定具体的泛型类型,而用通配符表示。如下:

//定义引用变量
List<> l1 = new ArrayList<String>();
l1 = new ArrayList<Integer>();

或者方法形参用于接收不同参数,实际也是一个引用变量,如下:

List<String> l1 = new ArrayList<String>();
List<Integer> l2 = new ArrayList<Integer>();
l1.add("AAA");
l1.add("BBB");
l2.add(111);
l2.add(222);
 public static void test1(List<?> l1){
     String join = Joiner.on(",").join(l1);
     System.out.println(join);
}

上面这个例子,感受到的力量没有。

2.3、T、?在继承上的体现

同一个类,如果泛型的具体类型不同,定义引用变量在不使用通配符的情况下,需要为每一个具体的实例创建对应的引用变量:

Animal<Cat> catA = new Animal<Cat>;
Animal<Dog> dogA = new Animal<Dog>;

如果用统配符:

Animal<> animal= new Animal<Cat>;
animal= new Animal<Dog>;

2.4、有限制通配符

2.4.1、? extends A:

? extends A:
G<? extends A> 可以作为G< A >和G< B >的父类,其中B是A的子类

注意: 这里同样? 只能是引用变量。

如:

 class A{

 }
 class B extends A{

 }
 class G<T>{

 }
 public void test3(){
    //G<? extends A> 是G<A>()、new G<B>()
    G<? extends A>  g = new G<A>();
    g = new G<B>();
 }

而如果用泛型来接收,那么只能是这样:

//需要定义2个变量
G<A> aa = new G<A>();
G<B> bb = new G<B>();

2.4.2、? super A:

? super A:
G<? super A> 可以作为G< A >和G< B >的父类,其中B是A的父类。

  class AA extends BB{

  }
  class BB{

  }
  public void test4(){
      G<? super AA>  g = new G<AA>();
      g = new G<BB>();
  }

同理,用泛型只能是这样:

G<AA> aa = new G<AA>();
G<BB> bb = new G<BB>();

2.5、无限制通配符和有限制通配符的数据读写问题

2.5.1、无限制通配符读写

读:可以读,尽管被无限制通配符修饰,但不管如何,容器里的元素永远是一个对象,也就是一个Object,所以可以用Object o这个引用变量来读取容器元素,即利用对象多态性。

写:不可以往容器里写入元素,因为写入的元素与容器的具体类型的关系不明确。比如:
可以定义成接收变量,但无法向里面添另数据。
在这里插入图片描述
list可以指向不同的具体容器,相对应的能接收的元素类型也跟着改变。因此往容器里添加数据时,会因为无法确定所能添加的具体元素类型为何,导致的类型不安全而编译不通过。

注意:可以添加null,因为null是所有类型的成员。

2.5.2、有限制通配符读写

1、? extends A:

读:往容器中添加的元素类型,一定是A或A的子类(如果是接口,则为实现类),因此读取出来的数据,一定可以用A类型来做引用(当然Object也可以)。

写:由于容器的具体类型未知,如果往容器添加元素,无法确保添加进去的具体数据是该容器具体类型的子类还是父类,因此存在类型不安全问题,所以是不允许往里添加数据的。

null可以添加

public static void test2(){
   List<String> l1 = new ArrayList<String>();
    l1.add("AAA");
    l1.add("BBB");

    read(l1);
    //这里我们传入格挡string类型的list,read_confirm方法中强制转换时,也要转成string,否则报错
    read_confirm(l1);
}
public static void read_confirm(List<?> list){
    //如果读的类型确认,也可以强制转换成 知道的类型
    List<String> str = (List<String>)list;
    //如果转成Integer会报错,则在遍历这个integers时会报错
    List<Integer> integers = (List<Integer>)list;
    for (String eachs : str) {
        System.out.print(eachs);
    }
}

2、? super A:

读:不管容器里添加的元素是A还是A的父类的实例对象,它们始终都是Object对象,因此可以读取,用Object类型来做引用(不能用A类型来做引用)。

写:只能写入A类型及其子类的实例对象。因为具体容器的类型最低等级是到A,所以不管容器具体类型为何,它都能保证>= A,所以A的实例化对象可以被写入(对象多态性),当然,既然作为父类的A可以被写入,那么A的子类自然而然也可以被写入容器里了。
注意:null仍然可以。

3、看下一些开源工具类中是如何使用

1、guava中的Joiner方法

List<String> l1 = new ArrayList<String>();
List<Integer> l2 = new ArrayList<Integer>();
l1.add("AAA");
l1.add("AAA");
l2.add(15);
l2.add(15);
//join方法的入参就是Iterable<?> ,因为list<Integer> list<String>都支持 
String join1 = Joiner.on(",").join(l1);
String join2 = Joiner.on(",").join(l2);

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

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

相关文章

峰会回顾 | 圆桌对话:低代码行业应用激发产业创新势能

编者荐语&#xff1a; 在万应低代码CMO徐智峰的主持下&#xff0c;中铁城建集团信息化管理部技术经理熊杰、中电信数智科技有限公司湖南分公司总经理助理施晓辉、湖南省建筑设计院集团数字科技中心开发部部长母建玉、长沙市规划信息服务中心技术总监尹彦围绕进行了精彩的圆桌对…

电脑监控系统有什么用处?

相信很多企业用户对电脑监控系统并不陌生&#xff0c;该系统存在于我们的日常工作中。我们都知道它会监管在工作时的行为&#xff0c;所以减少了很多摸鱼时间&#xff0c;只能一心工作。除此之外还有其他的很多功能&#xff0c;主要分为四大部分&#xff0c;下面让我们来一起了…

基于HAL库的STM32单定时器多路输入捕获测量PWM的频率和占空比实现(状态机方式实现)

目录 写在前面 先回顾下定时器的单路捕获PWM 多路捕获PWM的频率和占空比&#xff08;状态机实现) 我的思路: 状态图 配置 给出示例代码 测试效果 写在前面 先有了这篇文章实现了单定时器的多通道测量频率&#xff0c;以外部时钟的方式可测量任意频率的方波),奈何不能多路…

教你如何多人播报配音把

你们有没有在日常生活中遇到短视频的配音呢&#xff1f;那你们知不知道多人播报配音呢&#xff1f;其实它就是指通过合成多个不同的声音&#xff0c;实现多人对话或演唱的效果&#xff0c;并且可选择不同的声音和语速进行播报。而且它可以应用在广告宣传、盲人听书、电影动画、…

FPGA实战开发-基于DDR的图像缓存(下)

文章目录 概要整体架构流程技术名词解释技术细节小结 概要 例如&#xff1a; 基于米联科的学习资料&#xff0c;分享和学习同步&#xff0c;欢迎大家一起探讨。 整体架构流程 提示&#xff1a;这里可以添加技术整体架构 例如&#xff1a; image_data_gen产生了测试图片&…

1.1 C++友元函数与友元类

C友元 C中的友元&#xff08;friend&#xff09;是一种特殊的关系&#xff0c;它允许一个非成员函数或非当前类的成员函数访问一个类的私有成员。 具体来说&#xff0c;友元可以是一个函数、一个类或一个整个命名空间。 友元的声明通常在类定义中&#xff0c;它们可以被用来…

100G中长距离光模块,你选对了吗?

随着数据中心的快速发展&#xff0c;100G SR4支持的距离太短且成本又过高&#xff0c;在这种情况下&#xff0c;市场迎来了100G中长距离的解决方案&#xff1a;100G CWDM4和100G PSM4。对于100G中长距离方案选择也是各有千秋&#xff0c;下面就跟着小易来了解如何选择才是最合适…

idea中的快捷键大全, idea常用快捷键

文章目录 前言常用快捷键查找及修改快捷键根据快捷键名称查询根据快捷键查询修改快捷键 快捷键含义Alt/&#xff08;代码提示&#xff09;Ctrl/&#xff08;注释当前行&#xff09;CtrlF&#xff08;在当前文件中搜索&#xff09;CtrlShiftF&#xff08;全局搜索&#xff09;Ct…

自定义View中构造函数相关问题

目录 自定义View时&#xff0c;一个构造函数都不写&#xff0c;行不行&#xff1f;自定义View必须写构造函数&#xff0c;带几个参数&#xff1f; 自定义View时&#xff0c;一个构造函数都不写&#xff0c;行不行&#xff1f; 不行。 编译通不过。会提示&#xff1a; 为什么…

分布式系统概念和设计——复制技术

分布式系统概念和设计 复制 分布式系统中&#xff0c;复制是提高可用性和容错的关键技术。数据复制的技术&#xff0c;在多个计算机中维护数据的副本。复制是一种增强服务的技术。进行复制的动机包括改善服务性能&#xff0c;提高可用性&#xff0c;增强容错能力。 增强性能&…

遥感影像/无人机航片的空间分辨率GSD计算推导

遥感影像/无人机航片的空间分辨率GSD计算推导 参考资料1 参考资料2-地面分辨率&#xff0c;空间分辨率(GSD为地面采样间隔) GSD&#xff1a;无人机/遥感卫星的空间分辨率&#xff0c;指航片/遥感影像一个像素点代表的空间距离。 IFoV&#xff1a;单个像素代表的空间范围。 幅…

STM32开发——感应垃圾桶(舵机、超声波测距、振动检测)

目录 1.项目需求 2.sg90舵机介绍及实战 3.声波测距 4.感应垃圾桶 4.1GPIO口设置 4.2代码实现 1.项目需求 检测靠近时&#xff0c;垃圾桶自动开盖并伴随滴一声&#xff0c;2秒后关盖发生震动时&#xff0c;垃圾桶自动开盖并伴随滴一声&#xff0c;2秒后关盖按下按键时&…

ChatGPT 使用 拓展资料:吴恩达大咖 Building Systems with the ChatGPT API 输出检查

ChatGPT 使用 拓展资料:吴恩达大咖 Building Systems with the ChatGPT API 输出检查 在本视频中,将重点检查系统生成的输出。在向用户展示输出之前检查输出对于确保质量非常重要,提供给他们的响应的相关性和安全性,或者使用自动化或学习如何使用Moderation API。 Moderati…

labview 多位组合成1个字、1个字拆成多位

如果你需要将多位组合成1个字&#xff0c;以及将1个字拆成多位&#xff0c;本文能给你帮助。 在文章最后有下载链接&#xff08;labview 2018平台写的&#xff09; 1.多个布尔量和数字的转换 1.1多个布尔量转换为数字 图1-前面板(多个布尔量转换为数字) …

阿里巴巴内网开源的SpringCloudAlibaba笔记,把微服务玩的出神入化

SpringCloud Alibaba 为什么会出现&#xff1f; Spring Cloud Netflix 项目进入维护模式&#xff0c;Spring Cloud Netflix 将不再开发新的组件&#xff0c;我们知道 Spring Cloud 版本迭代算是比较快的&#xff0c;因而出现了很多中岛的 ISSUE 都来不及 Fix 就又推另一个 Rel…

做开发5年,这8个高效开发好习惯我悟了

优秀的Web开发人员工作效率更高&#xff0c;因为他们拥有丰富的经验和良好的习惯。工作多年&#xff0c;我有一些自己了解的习惯分享给大家&#xff0c;都曾让我受益&#xff0c;做开发5年了&#xff0c;今天来跟大家分享一下我的感想。✍&#x1f3fb; 首先&#xff0c;很多人…

CTFHub | php://input

0x00 前言 CTFHub 专注网络安全、信息安全、白帽子技术的在线学习&#xff0c;实训平台。提供优质的赛事及学习服务&#xff0c;拥有完善的题目环境及配套 writeup &#xff0c;降低 CTF 学习入门门槛&#xff0c;快速帮助选手成长&#xff0c;跟随主流比赛潮流。 0x01 题目描述…

Goby 漏洞更新|用友GRP-U8 软件 U8AppProxy 任意文件上传漏洞

漏洞名称&#xff1a;用友GRP-U8 软件 U8AppProxy 任意文件上传漏洞 English Name&#xff1a;yongyou GRP-U8 U8AppProxy Arbitrary file upload vulnerability CVSS core: 9.0 影响资产数&#xff1a;1308 漏洞描述&#xff1a; 用友GRP-U8管理软件是用友公司专注于国家…

上海性能测试平均年薪30W+,5分钟看明白你和30W的差距在哪?

性能测试是测试行业中颇具技术含量的工作&#xff0c;不仅要求工程师对系统进行一系列复杂的需求分析&#xff0c;制定完善的测试计划&#xff0c;设计出贴近实际用户使用场景的测试用例&#xff0c;还要把握系统性能变化趋势&#xff0c;给出专业的优化建议&#xff0c;帮助开…

Linux防火墙学习笔记4

iptables表的概念&#xff1a; 每个规则链上都设置了一串规则&#xff0c;我们就可以把不同的规则链组合成能够完成某一个特定功集合分类&#xff0c;而这个集合分类我们就称为表&#xff0c;iptables中共有5张表&#xff0c;学习iptables就是要搞明白每种表的作用。 filter&…