公司简介
发展历程
高端网站建设
微信开发
APP开发
网络营销服务
电商网站定制
生物医药网站建设
外贸网站建设
教育培训网站建设
小程序开发
功能应用
客户案例
网站建设案例
小程序案例
电商平台案例
APP案例
系统平台案例
什邡网站建设
什邡网站设计
什邡网站营销
什邡小程序
公司地址
人才招聘
地址:成都市太升南路288号锦天国际A幢1002号
电话:028-86922220
为企业提供网站建设、域名注册、服务器等服务
本篇内容介绍了“Java泛型的通配符有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
成都创新互联主营武城网站建设的网络公司,主营网站建设方案,app软件开发公司,武城h5重庆小程序开发公司搭建,武城网站营销推广欢迎武城等地区企业咨询
一句话说就是类型参数化。什么意思呢?参数化的意思就是我们在定义的时候不知道具体的值,我们在到我们实际运行的时候才知道具体的值。类型参数化就是具体类型在定义的时候不知道,在实际运行的时候是确定的某一个类型。
泛型是很多高级语言都有的特性。根据定义,泛型在运行时表示同一个类型,我们比较容易想到 List 和 List 用 2 个不同的 Class 表示,这个是可行的,但是 Java 由于需要兼容支持旧的代码,而且在推出泛型前就提供了容器类,这种方式(List 和 List 用 2 个不同的 Class)无法兼容以前的老代码,所以这个实现方法不适用。所以 Java 大佬们想了另外一种方式来实现泛型,这种方式就是类型擦除。
List
类型擦除
类型擦除就是在实际生成字节码的时候,编译器源码里面定义的 List 变成了 List,源码里面定义的 A Class 被擦除了,变成了 Object,同时在使用的时候,会强制类型转换,把取出来的 object 转成 A 的实例去使用。这就是类型擦除。初步看,泛型擦除好像是没什么大的问题,但是仔细想想,在强制类型转换的时候,由于会丢掉类型的一些信息,会导致一些不符合预期的事情。比如有个基类 A,和它的两个子类 B 和 C ,然后我们有下面的一段代码。List listA = new ArrayList(); listA.add(new B()); // 错误的,第二行代码是不符合预期的,因为 listA 里面期望放的是 A 而不是 B。 但是这个好像不太符合预期,我们有时候希望子类是可以放进容器里面的。但是如果支持这个操作的话,会发生什么呢?取出来来的是 B 还是 C ?如果不能明确,那么就没有实现“泛型”。为了解决这个问题, Java 大佬们想了个方法,提出了一些通配符来解决这些问题。泛型的通配符 ?、extends 和 super在理解通配符之前,我们需要知道的是,通配符的发明是为了解决什么问题?至少要解决的一个问题是:容器里面放进去的是什么,取出来的就是什么。这个问题,其实分两步,放进去,是说放进去同一种类型的东西。取出来,是说取出同一种类型的东西。或者说,用到通配符的地方应该是在不同的地方,一个地方把数据写到容器,另外一个地方把数据从容器拿出来,如果实在同一个代码块里写入和读取数据到同一个容器,应该是知道具体类型的,是不需要用到通配符的。? 通配符? 通配符称为无限通配符,表示不确定或者不关心类型。extends 通配符一般称为上界通配符,表示的意思是:取值范围为 (某个类的子类, 某个类]。再想想我们之前说的,通配符要解决的问题?放进去的是什么,取出来的就应该是什么。放数据和取数据应用在不同的场景。如果我们在同一个场景,就不需要用到通配符了,因为类型是已知的。通过上面的表述,容易推断出来 的集合只能往外拿数据,因为取出来的一定是 E ,但是放进去的不知道是什么,可能是 E ,也可能是 E 的子类,如果允许往集合里面放东西,就不能保证放进去的是什么,拿出来的就是什么了。因为只能保证拿出来的是 E 。这个特性也叫做协变。super 通配符一般称为下界通配符,表示的意思是:取值范围为 [某个类,这个类的父类)。结合上面小节的解释,可以推断出 的集合只能往里面放数据,而不能从里面拿东西,为什么呢?因为 解决的就是拿出来的问题啊,所以这个解决的就是放进去的问题啊,囧。里面放的是下限或者下限的子类。这个特性也叫做逆变。“Java泛型的通配符有哪些”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注创新互联网站,小编将为大家输出更多高质量的实用文章! 网站题目:Java泛型的通配符有哪些 文章源于:http://tjjierui.cn/article/piggdh.html 其他资讯 c语言解包函数代码 c语言解密函数 java中代码管理工具 java代码编辑器有哪些 java中的面向对象代码 java中的面向对象代码有哪些 java经销存系统代码 javaweb进销存 路由器的密码怎样改 路由器密码怎么改呀 在线咨询 服务热线 服务热线:028-86922220 TOP
List,源码里面定义的 A Class 被擦除了,变成了 Object,同时在使用的时候,会强制类型转换,把取出来的 object 转成 A 的实例去使用。这就是类型擦除。初步看,泛型擦除好像是没什么大的问题,但是仔细想想,在强制类型转换的时候,由于会丢掉类型的一些信息,会导致一些不符合预期的事情。比如有个基类 A,和它的两个子类 B 和 C ,然后我们有下面的一段代码。List listA = new ArrayList(); listA.add(new B()); // 错误的,第二行代码是不符合预期的,因为 listA 里面期望放的是 A 而不是 B。 但是这个好像不太符合预期,我们有时候希望子类是可以放进容器里面的。但是如果支持这个操作的话,会发生什么呢?取出来来的是 B 还是 C ?如果不能明确,那么就没有实现“泛型”。为了解决这个问题, Java 大佬们想了个方法,提出了一些通配符来解决这些问题。泛型的通配符 ?、extends 和 super在理解通配符之前,我们需要知道的是,通配符的发明是为了解决什么问题?至少要解决的一个问题是:容器里面放进去的是什么,取出来的就是什么。这个问题,其实分两步,放进去,是说放进去同一种类型的东西。取出来,是说取出同一种类型的东西。或者说,用到通配符的地方应该是在不同的地方,一个地方把数据写到容器,另外一个地方把数据从容器拿出来,如果实在同一个代码块里写入和读取数据到同一个容器,应该是知道具体类型的,是不需要用到通配符的。? 通配符? 通配符称为无限通配符,表示不确定或者不关心类型。extends 通配符一般称为上界通配符,表示的意思是:取值范围为 (某个类的子类, 某个类]。再想想我们之前说的,通配符要解决的问题?放进去的是什么,取出来的就应该是什么。放数据和取数据应用在不同的场景。如果我们在同一个场景,就不需要用到通配符了,因为类型是已知的。通过上面的表述,容易推断出来 的集合只能往外拿数据,因为取出来的一定是 E ,但是放进去的不知道是什么,可能是 E ,也可能是 E 的子类,如果允许往集合里面放东西,就不能保证放进去的是什么,拿出来的就是什么了。因为只能保证拿出来的是 E 。这个特性也叫做协变。super 通配符一般称为下界通配符,表示的意思是:取值范围为 [某个类,这个类的父类)。结合上面小节的解释,可以推断出 的集合只能往里面放数据,而不能从里面拿东西,为什么呢?因为 解决的就是拿出来的问题啊,所以这个解决的就是放进去的问题啊,囧。里面放的是下限或者下限的子类。这个特性也叫做逆变。“Java泛型的通配符有哪些”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注创新互联网站,小编将为大家输出更多高质量的实用文章! 网站题目:Java泛型的通配符有哪些 文章源于:http://tjjierui.cn/article/piggdh.html 其他资讯 c语言解包函数代码 c语言解密函数 java中代码管理工具 java代码编辑器有哪些 java中的面向对象代码 java中的面向对象代码有哪些 java经销存系统代码 javaweb进销存 路由器的密码怎样改 路由器密码怎么改呀 在线咨询 服务热线 服务热线:028-86922220 TOP
A Class
擦除
Object
object
A
初步看,泛型擦除好像是没什么大的问题,但是仔细想想,在强制类型转换的时候,由于会丢掉类型的一些信息,会导致一些不符合预期的事情。比如有个基类 A,和它的两个子类 B 和 C ,然后我们有下面的一段代码。
List listA = new ArrayList(); listA.add(new B()); // 错误的,
第二行代码是不符合预期的,因为 listA 里面期望放的是 A 而不是 B。 但是这个好像不太符合预期,我们有时候希望子类是可以放进容器里面的。但是如果支持这个操作的话,会发生什么呢?取出来来的是 B 还是 C ?如果不能明确,那么就没有实现“泛型”。
listA
B
C
为了解决这个问题, Java 大佬们想了个方法,提出了一些通配符来解决这些问题。
?
extends
super
在理解通配符之前,我们需要知道的是,通配符的发明是为了解决什么问题?至少要解决的一个问题是:容器里面放进去的是什么,取出来的就是什么。
这个问题,其实分两步,放进去,是说放进去同一种类型的东西。取出来,是说取出同一种类型的东西。或者说,用到通配符的地方应该是在不同的地方,一个地方把数据写到容器,另外一个地方把数据从容器拿出来,如果实在同一个代码块里写入和读取数据到同一个容器,应该是知道具体类型的,是不需要用到通配符的。
? 通配符称为无限通配符,表示不确定或者不关心类型。
一般称为上界通配符,表示的意思是:取值范围为 (某个类的子类, 某个类]。再想想我们之前说的,通配符要解决的问题?放进去的是什么,取出来的就应该是什么。放数据和取数据应用在不同的场景。如果我们在同一个场景,就不需要用到通配符了,因为类型是已知的。
通过上面的表述,容易推断出来 的集合只能往外拿数据,因为取出来的一定是 E ,但是放进去的不知道是什么,可能是 E ,也可能是 E 的子类,如果允许往集合里面放东西,就不能保证放进去的是什么,拿出来的就是什么了。因为只能保证拿出来的是 E 。
E
这个特性也叫做协变。
一般称为下界通配符,表示的意思是:取值范围为 [某个类,这个类的父类)。结合上面小节的解释,可以推断出 的集合只能往里面放数据,而不能从里面拿东西,为什么呢?因为 解决的就是拿出来的问题啊,所以这个解决的就是放进去的问题啊,囧。里面放的是下限或者下限的子类。
这个特性也叫做逆变。
“Java泛型的通配符有哪些”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注创新互联网站,小编将为大家输出更多高质量的实用文章!