Java泛型中<?>和<T>的区别浅析
https://www.jb51.net/article/270336.htm
一、定义
1、T 代表一种类型
可以加在类上,也可以加在方法上
1)T 加在类上
|
1
2
3
|
class SuperClass<A>{ //todo} |
2)T 加在方法上
|
1
2
3
|
public <T>void fromArrayToList(T[] arr, List<T> list){ //todo} |
说明:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
> 上面方法上的<T>代表括号里面要用到泛型参数,若类中传了泛型,此处可以不传,> 调用类型上面的泛型参数,前提是方法中使用的泛型与类中传来的泛型一致, 如下所示: /** * 类上的 泛型T 和 方法中的参数相同, * 所以方法的返回值处 可以 不加<T> */class SuperClass<T>{ public void fromArrayToList(T[] arr, List<T> list){ //todo } } |
扩展:
如果有泛型方法和非泛型方法,都满足条件,会执行非泛型方法
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
//非泛型方法 public void show(String s){ System.out.println("1");} //泛型方法@Overridepublic void show(T a) { System.out.println("2");} |
如上示例,调用show方法时,因为非泛型方法存在,会优先执行show(String s)方法
2、?是通配符,泛指所有类型
一般用于定义一个引用变量
|
1
2
3
4
5
|
SuperClass<?> sup = new SuperClass<String>("lisi");sup = new SuperClass<People>(new People());sup = new SuperClass<Animal>(new Animal()); |
若不用?,用固定的类型的话,则:
|
1
2
3
4
5
|
SuperClass<String> sup1 = new SuperClass<String>("lisi");SuperClass<People> sup2 = new SuperClass<People>;SuperClass<Animal> sup3 = new SuperClass<Animal>; |
这就是 ? 通配符的好处:定义一个sup的引用变量,就可以指向多个对象。
二、使用
1、T 一般有两种用途
1) 定义一个通用的泛型方法
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
// Dao 定义1个通用的泛型方法getListpublic interface Dao{ List<T> getList(){};} // 使用 Dao的泛型方法getList 返回String类型List<String> getStringList(){ return dao.getList();//dao是一个实现类实例}// 使用 Dao的泛型方法getList 返回Integer类型List<Integer> getIntList(){ return dao.getList();} |
PS:上面接口的getList方法如果定义成List<?> ,后面就会报错。
2) 限制方法的参数之间或参数和返回结果之间的关系
|
1
2
|
// 限制参数 param1、param2、返回值都是T类型List<T> getList<T param1,T param2> |
这样可以限制返回结果的类型以及两个参数的类型一致
2、<?> 的限制用途
<?> 一般就是在泛型起一个限制作用,如下示例:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
// 定义1个父类Fruitpublic Class Fruit(){}// 定义1个子类Apple,继承Fruitpublic Class Apple extends Fruit(){}// 定义1个方法test,限制参数类型只能是 Fruit 或 Fruit的子类public void test(? extends Fruit){ //todo};/** 以下是调用 */test(new Fruit()); // 传参为 父类Fruittest(new Apple()); // 传参为 父类Fruit的子类Appletest(new String()); //这个会报错, 因为定义方法的传参,限制死了 |
3、三种泛型限定
|
1
2
3
|
ArrayList<T> al=new ArrayList<T>(); //指定集合元素只能是T类型ArrayList<? extends E> al=new ArrayList<? extends E>(); //指定集合元素只能是E类型或者E的子类型ArrayList<? super E> al=new ArrayList<? super E>(); //指定集合元素只能是E类型或者E的父类型 |
三、总结
1、从定义上看
T和?定义的地方有点不同,?是定义在引用变量上,T是类上或方法上
2、从用途上看
“T>“和”<?>”,首先要区分开两种不同的场景:
第一,声明一个泛型类或泛型方法;
第二,使用泛型类或泛型方法。
类型参数“T>”主要用于第一种,声明泛型类或泛型方法
无界通配符“<?>”主要用于第二种,使用泛型类或泛型方法
补充:场景
|
1
2
3
|
ArrayList al=new ArrayList();指定集合元素只能是T类型ArrayList<?> al=new ArrayList<?>();集合元素可以是任意类型,这种没有意义,一般是方法中,只是为了说明用法ArrayList<? extends E> al=new ArrayList<? extends E>(); |
泛型的限定:
- ? extends E:接收E类型或者E的子类型。
- ?super E:接收E类型或者E的父类型。
到此这篇关于Java泛型中<?>和<T>区别的文章就介绍到这了,更多相关Java泛型<?>和<T>区别内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
Java泛型中<?>和<T>的区别浅析的更多相关文章
- Java泛型中extends和super的区别?
<? extends T>和<? super T>是Java泛型中的"通配符(Wildcards)"和"边界(Bounds)"的概念. ...
- Java泛型中E、T、K、V等的含义
Java泛型中的标记符含义: E - Element (在集合中使用,因为集合中存放的是元素) T - Type(Java 类) K - Key(键) V - Value(值) N - Numbe ...
- 【转】聊一聊-JAVA 泛型中的通配符 T,E,K,V,?
原文:https://juejin.im/post/5d5789d26fb9a06ad0056bd9 前言 Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型 ...
- java泛型中特殊符号的含义
java泛型中的标记符含义: E - Element (在集合中使用,因为集合中存放的是元素) T - Type(Java 类) K - Key(键) V - Value(值) N - Number ...
- Java泛型中<?> 和 <? extends Object>的异同分析
相信很多人和我一样,接触Java多年,却仍旧搞不清楚 Java 泛型中 <?>和 <? extends Object>的相似和不同.但是,这应该是一个比较高端大气上档次的Que ...
- Java泛型中的通配符T,E,K,V
Java泛型中的通配符T,E,K,V 1.泛型的好处 2.泛型中的通配符 2.1 T,E,K,V,? 2.2 ?无界通配符 2.3 上界通配符 < ? extends E> 2.4 下界通 ...
- Java泛型中的细节
Java泛型中的细节 如果没有泛型 学习Java,必不可少的一个过程就是需要掌握泛型.泛型起源于JDK1.5,为什么我们要使用泛型呢?泛型可以使编译器知道一个对象的限定类型是什么,这样编译器就可以在一 ...
- Java 泛型中的通配符
本文内容如下: 1. 什么是类型擦除 2.常用的 ?, T, E, K, V, N的含义 3.上界通配符 < ?extends E> 4.下界通配符 < ?super E> 5 ...
- Java泛型中extends和super的理解(转)
E – Element (在集合中使用,因为集合中存放的是元素) T – Type(Java 类) K – Key(键) V – Value(值) N – Number(数值类型) ? – 表示不确定 ...
- Java泛型中的标记符含义:
Java泛型中的标记符含义: E - Element (在集合中使用,因为集合中存放的是元素) T - Type(Java 类) K - Key(键) V - Value(值) N - Number( ...
随机推荐
- 二:简单的C/S阻塞模型
C/S阻塞模型是指客户端/服务器阻塞模型,它描述了一种基于阻塞的网络通信方式.在阻塞模型中,客户端发送请求给服务器,并等待服务器的响应.在等待服务器响应的过程中,客户端的操作会被阻塞,直到服务器响应返 ...
- 编译原理:python编译器--运行时机制
python的运行时机制的核心 -- python对象机制的设计 理解字节码的执行过程 用 GDB 跟踪执行一个简单的示例程序,它只有一行:"a=1". 对应的字节码如下.其中,前 ...
- Autocad二次开发中的XData
Autocad允许应用程序在实体对象上附加XDATA(扩展数据).XDATA可以附在任何图形实体以及层,线型等非图形实体上,Autocad负责维护这些信息,但不使用这些信息,也不在图纸中直接表现出来. ...
- Pycomcad快速绘制参数化多段线的一种方法
任务: 绘制出不同长度的相同型式的多段线,如上图所示,仅仅是300mm和500mm的区别,3个弯折处都一样,都是圆弧段,对于常规二次开发思路,是通过数学计算,计算出圆弧的圆心的位置,用固定的半径,绘制 ...
- OS期末复习总结
期末样题 : 链接:https://pan.baidu.com/s/12Mfi_lnhBDbuke6B_qCiJg 提取码:khp7 一.易错易混点: 下列进程调度算法中,可能引起进程长时间得不到运行 ...
- Github Copilot 实战: 从零开始用AI写一个OCR工具 (3)
源码 https://github.com/densen2014/Blazor100/tree/master/AI/MiOcr 添加一个屏幕截图功能,显示截图起始点,结束点,截图区域,按键ESC取消截 ...
- 深入理解Java引用类型和值调用-变量在内存里存在哪里
目录 引言 数据类型分类 基本类型 引用类型 引用分类 数据存在哪 基本类型与引用类型的区别 值传递 引用对象传递之例外null Reference 引言 什么是数据类型?在计算机科学和计算机编程 ...
- Spring Boot项目基于POI框架导出Excel表格
1. 依赖 我的项目是基于Spring Boot的,这里只贴出POI框架需要依赖的两个包,其他的都无所谓,只要能提供Controller让浏览器访问即可.在pom.xml配置文件中增加如下两个包 ...
- [读书笔记]《大数据之路》——阿里数据整合及管理体系——OneData模型
阿里数据整合及管理体系--OneData模型 摘要 阿里的<大数据之路>第9章介绍了其内部进行数据整合及管理的方法体系和工具OneData.他们在这一体系下,构建统 .规范.可共的全域数据 ...
- tcpdump工具使用
一.简单介绍 tcpdump命令是一款sniffer工具,它可以打印所有经过网络接口的数据包的头信息,也可以使用-w选项将数据包保存到文件中,方便以后分析. 二.使用语法 语法: tcpdump (选 ...