网易首页 > 网易号 > 正文 申请入驻

面试官问:Java泛型中T、E、K、V、?通配符,你确定都了解吗?

0
分享至

前言

Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许开发者在编译时检测到非法的类型。

泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。

泛型带来的好处

public class GlmapperGeneric {
private T t;
public void set(T t) { this.t = t; }
public T get() { return t; }

public static void main(String[] args) {
// do nothing
}

/**
* 不指定类型
*/
public void noSpecifyType(){
GlmapperGeneric glmapperGeneric = new GlmapperGeneric();
glmapperGeneric.set("test");
// 需要强制类型转换
String test = (String) glmapperGeneric.get();
System.out.println(test);
}

/**
* 指定类型
*/
public void specifyType(){
GlmapperGeneric glmapperGeneric = new GlmapperGeneric();
glmapperGeneric.set("test");
// 不需要强制类型转换
String test = glmapperGeneric.get();
System.out.println(test);
}
}

上面这段代码中的 specifyType 方法中 省去了强制转换,可以在编译时候检查类型安全,可以用在类,方法,接口上。

泛型中通配符

我们在定义泛型类,泛型方法,泛型接口的时候经常会碰见很多不同的通配符,比如 T,E,K,V 等等,这些通配符又都是什么意思呢?

常用的 T,E,K,V,?

本质上这些个都是通配符,没啥区别,只不过是编码时的一种约定俗成的东西。比如上述代码中的 T ,我们可以换成 A-Z 之间的任何一个 字母都可以,并不会影响程序的正常运行,但是如果换成其他的字母代替 T ,在可读性上可能会弱一些。通常情况下,T,E,K,V,?是这样约定的:

?表示不确定的 java 类型 T (type) 表示具体的一个java类型 K V (key value) 分别代表java键值中的Key Value E (element) 代表Elemen

?无界通配符

先从一个小例子看起,原文在这里 。更多面试题资料:https://www.yoodb.com/

我有一个父类 Animal 和几个子类,如狗、猫等,现在我需要一个动物的列表,我的第一个想法是像这样的:

List listAnimals

但是老板的想法确实这样的:

List extends Animal> listAnimals

为什么要使用通配符而不是简单的泛型呢?通配符其实在声明局部变量时是没有什么意义的,但是当你为一个方法声明一个参数时,它是非常重要的。

static int countLegs (List extends Animal > animals ) {
int retVal = 0;
for ( Animal animal : animals )
retVal += animal.countLegs();
return retVal;

static int countLegs1 (List< Animal > animals ){
int retVal = 0;
for ( Animal animal : animals )
{
retVal += animal.countLegs();
}
return retVal;
}

public static void main(String[] args) {
List dogs = new ArrayList<>();
// 不会报错
countLegs( dogs );
// 报错
countLegs1(dogs);
}

当调用 countLegs1 时,就会飘红,提示的错误信息如下:

所以,对于不确定或者不关心实际要操作的类型,可以使用无限制通配符(尖括号里一个问号,即 ),表示可以持有任何类型。公众号“Java精选”,获取最新面试题大全。像 countLegs 方法中,限定了上届,但是不关心具体类型是什么,所以对于传入的 Animal 的所有子类都可以支持,并且不会报错。而 countLegs1 就不行。

上界通配符 < ? extends E>

上届:用 extends 关键字声明,表示参数化的类型可能是所指定的类型,或者是此类型的子类。

在类型参数中使用 extends 表示这个泛型中的参数必须是 E 或者 E 的子类,这样有两个好处:

1)如果传入的类型不是 E 或者 E 的子类,编译不成功

2)泛型中可以使用 E 的方法,要不然还得强转成 E 才能使用

private E test(K arg1, E arg2){
E result = arg2;
arg2.compareTo(arg1);
return result;

类型参数列表中如果有多个类型参数上限,用逗号分开

下界通配符 < ? super E>

下界: 用 super 进行声明,表示参数化的类型可能是所指定的类型,或者是此类型的父类型,直至 Object

在类型参数中使用 super 表示这个泛型中的参数必须是 E 或者 E 的父类。

private void test(List super T> dst, List src){
for (T t : src) {
dst.add(t);

public static void main(String[] args) {
List dogs = new ArrayList<>();
List animals = new ArrayList<>();
new Test3().test(animals,dogs);
}
// Dog 是 Animal 的子类
class Dog extends Animal {

dst 类型 “大于等于” src 的类型,这里的“大于等于”是指 dst 表示的范围比 src 要大,因此装得下 dst 的容器也就能装 src 。

?和 T 的区别

?和 T 都表示不确定的类型,区别在于我们可以对 T 进行操作,但是对 ?不行,比如如下这种 :

// 可以
T t = operate();

// 不可以
?car = operate();

简单总结下:

T 是一个 确定的 类型,通常用于泛型类和泛型方法的定义,?是一个 不确定 的类型,通常用于泛型方法的调用代码和形参,不能用于定义类和泛型方法。

区别1:通过 T 来 确保 泛型参数的一致性

// 通过 T 来 确保 泛型参数的一致性
public void
test(List dest, List src)


像下面的代码中,约定的 T 是 Number 的子类才可以,但是申明时是用的 String ,所以就会飘红报错。

不能保证两个 List 具有相同的元素类型的情况

GlmapperGeneric glmapperGeneric = new GlmapperGeneric<>();
List dest = new ArrayList<>();
List src = new ArrayList<>();
glmapperGeneric.testNon(dest,src);

上面的代码在编译器并不会报错,但是当进入到 testNon 方法内部操作时(比如赋值),对于 dest 和 src 而言,就还是需要进行类型转换。

区别2:类型参数可以多重限定而通配符不行

使用 & 符号设定多重边界(Multi Bounds),指定泛型类型 T 必须是 MultiLimitInterfaceA 和 MultiLimitInterfaceB 的共有子类型,此时变量 t 就具有了所有限定的方法和属性。对于通配符来说,因为它不是一个确定的类型,所以不能进行多重限定。

区别3:通配符可以使用超类限定而类型参数不行

类型参数 T 只具有 一种 类型限定方式:

T extends A

但是通配符 ? 可以进行 两种限定:

? extends A
? super A
Class 和 Class 区别

前面介绍了 ?和 T 的区别,那么对于,Class 和 又有什么区别呢?Class 和 Class

最常见的是在反射场景下的使用,这里以用一段发射的代码来说明下。

// 通过反射的方式生成 multiLimit
// 对象,这里比较明显的是,我们需要使用强制类型转换
MultiLimit multiLimit = (MultiLimit)
Class.forName("com.glmapper.bridge.boot.generic.MultiLimit")

对于上述代码,在运行期,如果反射的类型不是 MultiLimit 类,那么一定会报 java.lang.ClassCastException 错误。

对于这种情况,则可以使用下面的代码来代替,使得在在编译期就能直接 检查到类型的问题:

Class 在实例化的时候,T 要替换成具体类。Class 它是个通配泛型,? 可以代表任何类型,所以主要用于声明时的限制情况。比如,我们可以这样做申明:

// 可以
public Class clazz;
// 不可以,因为 T 需要指定类型
public Class clazzT;

所以当不知道定声明什么类型的 Class 的时候可以定义一 个Class。

那如果也想 public Class clazzT; 这样的话,就必须让当前的类也指定 T ,

public class Test3 {
public Class clazz;
// 不会报错
public Class clazzT;
小结

本文零碎整理了下 JAVA 泛型中的一些点,不是很全,仅供参考。如果文中有不当的地方,欢迎指正。

作者:磊叔_GLMapper juejin.cn/post/6844903917835419661#heading-11

公众号“Java精选”所发表内容注明来源的,版权归原出处所有(无法查证版权的或者未注明出处的均来自网络,系转载,转载的目的在于传递更多信息,版权属于原作者。如有侵权,请联系,笔者会第一时间删除处理!

最近有很多人问,有没有读者交流群!加入方式很简单,公众号Java精选,回复“加群”,即可入群!

(微信小程序):3000+道面试题,包含Java基础、并发、JVM、线程、MQ系列、Redis、Spring系列、Elasticsearch、Docker、K8s、Flink、Spark、架构设计等,在线随时刷题!

特别推荐:专注分享最前沿的技术与资讯,为弯道超车做好准备及各种开源项目与高效率软件的公众号,「大咖笔记」,专注挖掘好东西,非常值得大家关注。点击下方公众号卡片关注

文章有帮助的话,点在看,转发吧!

//通配符是 不确定的,所以这个方法不能保证两个 List 具有相同的元素类型
public void
test(List extends Number> dest, List extends Number> src)

}

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
纸板床&没空调!澎湃:巴黎不在奥运村安装空调,靠水冷系统降温

纸板床&没空调!澎湃:巴黎不在奥运村安装空调,靠水冷系统降温

直播吧
2024-06-13 15:09:13
LV售后再次被曝双标,公然歧视中国消费者:同一个包在欧洲免费维修,在中国就要收费

LV售后再次被曝双标,公然歧视中国消费者:同一个包在欧洲免费维修,在中国就要收费

可达鸭面面观
2024-06-12 16:04:43
蔡磊夫妇,“翻车”了,直播镜头后的蔡磊,藏不住了?

蔡磊夫妇,“翻车”了,直播镜头后的蔡磊,藏不住了?

李昕言温度空间
2024-06-05 14:54:34
妻子全家都知道她背着我出轨,但出轨对象说:这不是我的本意

妻子全家都知道她背着我出轨,但出轨对象说:这不是我的本意

宅家伍菇凉
2024-06-11 20:10:01
炸裂!高中毕业典礼家长演讲火了,网友:这才是高手,信息量很大

炸裂!高中毕业典礼家长演讲火了,网友:这才是高手,信息量很大

户外阿毽
2024-06-13 01:36:39
大事不妙,A股发出严重警告,这两个方向或将血流成河

大事不妙,A股发出严重警告,这两个方向或将血流成河

静守时光落日
2024-06-13 02:25:02
龙舟赛上,女鼓手穿着十分开放引争议,网友:屈原看了会再跳一次

龙舟赛上,女鼓手穿着十分开放引争议,网友:屈原看了会再跳一次

元爸体育
2024-06-13 09:53:13
中国GDP已经滑落到美国的59%了,这是怎么了?

中国GDP已经滑落到美国的59%了,这是怎么了?

老道闲聊
2024-05-07 11:54:26
文旅局局长被指“官谱太大” 调研时有人打伞? 本人回应

文旅局局长被指“官谱太大” 调研时有人打伞? 本人回应

蓬勃新闻
2024-06-13 09:36:31
好消息!中国男足姆巴佩在欧洲联赛单场强势戴帽,武磊都不如他

好消息!中国男足姆巴佩在欧洲联赛单场强势戴帽,武磊都不如他

评球论事
2024-06-13 21:53:52
郭士强新名单做出3个轰动调整,广东多人入选,辽宁和新疆很遗憾

郭士强新名单做出3个轰动调整,广东多人入选,辽宁和新疆很遗憾

家乡体育
2024-06-13 23:56:10
娱乐圈森严的等级,从“慕容复”的一份盒饭上,看得明明白白

娱乐圈森严的等级,从“慕容复”的一份盒饭上,看得明明白白

谈娱新语
2024-06-12 22:31:10
曝孙一宁与王思聪恋爱,偷偷在日本约会?本人回应:“有种别删”

曝孙一宁与王思聪恋爱,偷偷在日本约会?本人回应:“有种别删”

拾娱先生
2024-06-12 22:19:39
超长补时❌本届欧洲杯不会使用超长补时,而是沿用欧冠规则

超长补时❌本届欧洲杯不会使用超长补时,而是沿用欧冠规则

直播吧
2024-06-12 21:42:15
1951年,小战士送炮弹见军长眼熟,意外发现是他“牺牲”19年的父亲

1951年,小战士送炮弹见军长眼熟,意外发现是他“牺牲”19年的父亲

古今档案
2024-06-01 23:29:16
福耀科技大学未通过审批,曹德旺发声,他的告白引热议

福耀科技大学未通过审批,曹德旺发声,他的告白引热议

吾天
2024-06-13 00:01:18
俄罗斯一个决定,中国多赚1千亿!美日心凉半截,纷纷求助中国!

俄罗斯一个决定,中国多赚1千亿!美日心凉半截,纷纷求助中国!

星辰故事屋
2024-06-13 17:23:19
湖南:小伙捧鲜花表白女技师,做足疗一见钟情,网友:长得很哇塞

湖南:小伙捧鲜花表白女技师,做足疗一见钟情,网友:长得很哇塞

百晓史
2024-06-02 09:09:36
金砖国家运动会在俄罗斯喀山开幕

金砖国家运动会在俄罗斯喀山开幕

界面新闻
2024-06-13 08:34:56
传说中的“天马”,误闯江西居民区,众人合伙才将其控制

传说中的“天马”,误闯江西居民区,众人合伙才将其控制

文史微鉴
2024-06-13 06:28:53
2024-06-14 00:58:44
Java精选
Java精选
一场永远也演不完的戏
1551文章数 3855关注度
往期回顾 全部

科技要闻

小红书员工仅1/5工龄满2年 32岁就不让进了

头条要闻

韩国女子20年前遭"集体性侵" 44名嫌犯无一人受到刑罚

头条要闻

韩国女子20年前遭"集体性侵" 44名嫌犯无一人受到刑罚

体育要闻

乔丹最想单挑的男人走了

娱乐要闻

森林北报案,称和汪峰的感情遭受压力

财经要闻

私募大佬孙强:中国为什么缺少耐心资本

汽车要闻

升级8155芯片 新款卡罗拉锐放售12.98-18.48万

态度原创

时尚
旅游
游戏
亲子
军事航空

受法律保护的可颂,究竟有多好吃!?

旅游要闻

山西文旅厅厅长与董宇辉拉家常:中午回家吃了饭

主播请路过老人玩《无畏契约》:击杀就送鸡蛋等

亲子要闻

不想生孩子的00后,正掉进“娃娃陷阱”

军事要闻

美军演习将罕见以4万吨级准航母作为靶舰

无障碍浏览 进入关怀版