范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

JAVA冷知识什么是逆变与协变?数组是否支持协变ampampamp逆变?泛型呢?

  写在前面和小伙伴分享一些 java 小知识点,主要围绕下面几点:什么是 逆变(contravariant) &协变(covariant) ?数组 支持协变&逆变 吗?泛型 支持协变&逆变 吗?部分内容参考  《编写高质量代码(改善Java程序的151个建议)》 博文理解有误的地方小伙伴留言私信一起讨论
  生活不能等待别人来安排,要自己去争取和奋斗;而不论其结果是喜是悲,但可以慰藉的是,你总不枉在这世界上活了一场。有了这样的认识,你就会珍重生活,而不会玩世不恭;同时,也会给人自身注入一种强大的内在力量。 ——路遥《平凡的世界》
  关于 协变 与逆变 到底是什么意思,其实很好理解,用一句话描述:(小伙伴们看到下面的话,会不会想到这不就是多态 吗,哈,今天我们只看协变和逆变 ,关于多态 的一些内容,如强制多态 ,包含多态 ,重载多态 等之后有机会和小伙伴们分享)
  协变  即指窄类型替换宽类型 ,逆变  即宽类型覆盖窄类型
  这里的 窄类型 即子类(派生类) ,这里的宽类型 即父类(基类,超类) ,那这里的替换覆盖 又是什么意思,这里就要说到OO(面相对象)六大设计 原则之一的LSP(里氏代换原则 Liskov Substitution Principle) ,里氏代换原则 中说,任何基类 可以出现的地方,子类 一定可以出现。LSP 是继承复用的基石,只有当派生类 可以替换掉基类 ,且软件单位的功能不受到影响时,基类 才能真正被复用,而派生类 也能够在基类 的基础上增加新的行为 。
  下面们结合代码就数组和泛型的协变和逆变进行分析
  我们来看一段代码 package com.liruilong;  import java.util.Arrays;  /**  * @Project_name: workspack  * @Package: com.liruilong  * @Description:  * @Author: 1224965096@qq.com  * @WeChat_Official_Accounts: 山河已无恙  * @blog: https://liruilong.blog.csdn.net/  * @Date: 2022/2/11  1:18  */ public class CovariantDemo {      public static void main(String[] args) {         Number [] numbers = {1,1L,3d,2.0F};         Arrays.stream(numbers).forEach(System.out::print);     } }
  Number类是所有基本类型封装类的父类,同理基本类型封装类为Number类的子类,关于自动装箱和自动拆箱是java在JDK1.5的时候引入的新特性,我们这里不多讲,上面的代码可以正常编译,并且输出下面的内容,这里,数组里的基本类型装箱为封装类放到了堆中,这些封装类可以出现在Number类定义的数组中,说明子类可以替换了父类,即数组是满足协变的。 113.02.0 Process finished with exit code 0
  既然数组支持 协变 ,那么逆变 呢?我们来看看package com.liruilong;  import java.util.Arrays;  /**  * @Project_name: workspack  * @Package: com.liruilong  * @Description:  * @Author: 1224965096@qq.com  * @WeChat_Official_Accounts: 山河已无恙  * @blog: https://liruilong.blog.csdn.net/  * @Date: 2022/2/11  1:18  */ public class CovariantDemo {      public static void main(String[] args) {         Number [] numbers = {new Object()};         Arrays.stream(numbers).forEach(System.out::print);     } }
  这里我们把数组元素换成 Object类 ,即所有类的父类,希望是可以通过父类来覆盖代替子类 ,但是直接编译报错 ,说明数组 是不支持直接逆变 的Error:(17, 30) java: 不兼容的类型: java.lang.Object无法转换为java.lang.Number
  数组不支持直接逆变,那么是否可以接见的实现逆变的,这里我么就要用到 多态 里的一种,强制多态 ,即强制类型转化 试试package com.liruilong;  import java.util.Arrays;  /**  * @Project_name: workspack  * @Package: com.liruilong  * @Description:  * @Author: 1224965096@qq.com  * @WeChat_Official_Accounts: 山河已无恙  * @blog: https://liruilong.blog.csdn.net/  * @Date: 2022/2/11  1:18  */ public class CovariantDemo {     class A {      }     class B extends A{            }      public static void main(String[] args) {         A a = new CovariantDemo().new A();         B [] bs = {(B) a};         Arrays.stream(bs).forEach(System.out::print);     } }
  类型转化报错 。说明对于数组的逆变 来讲,是不支持逆变 的,将父类强制转化为子类报类型转化异常,java并没有对这方面做限制。Exception in thread "main" java.lang.ClassCastException: com.liruilong.CovariantDemo$A cannot be cast to com.liruilong.CovariantDemo$B  at com.liruilong.CovariantDemo.main(CovariantDemo.java:24)  Process finished with exit code 1
  通过上面代码,我们可以知道数组支持协变,不支持逆变 ,那泛型呢?对于协变和逆变是否支持
  泛型不支持协变也不支持逆变 ,即不能把一个父类对象赋值给一个子类类型变量 ,相反也是同理。
  下面我们看看代码 package com.liruilong;  import java.util.ArrayList; import java.util.List;  /**  * @Project_name: workspack  * @Package: com.liruilong  * @Description:  * @Author: 1224965096@qq.com  * @WeChat_Official_Accounts: 山河已无恙  * @blog: https://liruilong.blog.csdn.net/  * @Date: 2022/2/11  1:18  */ public class CovariantDemo {     public static void main(String[] args) {         List ln = new ArrayList();     } }
  java 为了保证运行期 的安全性 ,必须保证泛型参数类型 是固定 的,所以它不允许 一个泛型参数 可以同时包含两种类型 ,即使为父子关系 也不行。所以直接编译报错 ,即泛型不支持协变也不支持逆变 .Error:(17, 27) java: 不兼容的类型: java.util.ArrayList无法转换为java.util.List
  但可以使用 通配符(Wildcard)模拟协变逆变 ,通配符在编译期有效,在运行期必须为一个明确的类型package com.liruilong;  import java.util.ArrayList; import java.util.List;  /**  * @Project_name: workspack  * @Package: com.liruilong  * @Description:  * @Author: 1224965096@qq.com  * @WeChat_Official_Accounts: 山河已无恙  * @blog: https://liruilong.blog.csdn.net/  * @Date: 2022/2/11  1:18  */ public class CovariantDemo {     public static void main(String[] args) {         List< ? extends Number > list = new ArrayList();     } }
  即 Number 的子类型都可以为泛型类型参数,即允许NUmber 所有的子类作为泛型参数类型,在运行期为一个具体的值.编译没有报错  Process finished with exit code 0
  逆变同样也是可以,即泛型可以通过 super 和extends 来模拟实现协变和逆变,但是本身是不存在协变和逆变 的,这里主要利用了泛型在编译器有效List< ? super Integer> li = new ArrayList();
  关于协变逆变就和小伙伴分享到这里,嗯,还有协变逆变方法,这里要简单说明下
  协变方法 : 即子类的方法返回值的类型比父类方法要窄,即该方法为协变方法,也称 多态,覆写,重写 。//子类的doStuff()方法返回值的类型比父类方法要窄,即该方法为协变方法,也称多态。     class A{         public  Number doStuff(){             return 0;         }     }     class B extends A{         @Override         public  Integer doStuff(){             return 0;         }     }
  逆变方法 :子类的方法返回值的类型比父类方法宽,此时为逆变方法。虽然子类扩大了父类的输入返回参数,但是这里已经是 重载 了。//子类的doSutff方法返回值的类型比父类方法宽,此时为逆变方法,     class C {         public Integer doStuff(Integer i) {             return 0;         }     }     class D extends C {         public Number doStuff(Number i) {             return 0;         }     }

风格化VR影视动画DreamDrops的创作心得观感导演手绘查看引用信息源请点击映维网DreamDrops的创作心得(映维网2021年10月18日)VR体验DreamDrops在TheRookieAwards2021的两个沉浸式媒体类别中斩Facebook宣布将在欧洲增加10000个元宇宙工作岗位(映维网2021年10月18日)如果要成为一家元宇宙公司,Facebook将需要大量的人才。所以,这家公司日前宣布将在五年内于欧盟境内增加10000个高技能工作岗位,从而帮助构建自显示FOV等问题待解决,美陆军推迟基于HoloLens2的IVAS测试工作查看引用信息源请点击armytimes原来的80度视场目标或调低至70度(映维网2021年10月15日)美国ArmyTimes陆军时报引述参与项目的军官称,为提高设备的一致性,湿度舍弗勒为全球工厂大规模配备HoloLens2,提高工厂效率和灵活性(映维网2021年10月14日)作为一家全球汽车和工业供应商,德国舍弗勒集团依靠先进的机器来大规模生产高质量的产品,并通过一支训练有素的维护技术人员团队来确实所述机器在全球75家工必和必拓用HoloLens2混合现实为千里之外采矿场提供支持和培训(映维网2021年10月20日)对于澳大利亚矿业公司必和必拓来说,效率和安全是必不可少的目标,而两者又是相辅相成。在新冠疫情爆发期间,当安全限制要求限制采矿现场的工作人员时,必和必奥迪用HoloLens2提升线下车展体验和工厂物流规划效率(映维网2021年10月16日)混合现实技术大大提高了奥迪的产品展示效果和物流规划效率。这家高端汽车制造商得以更有效地接触行业受众,并在世界各地的奥迪工厂更快速地部署新技术尤其考虑星移眼动追踪首次亮相世界VR产业大会声明新闻稿非映维官方稿,法律问题一律与映维无关南昌虚拟现实研究院(江西省虚拟现实创新中心)自主研发的星移VR眼动追踪解决方案在2021世界VR产业大会首次公开亮相。眼动追踪是获取用郭明錤苹果ARVR头显推迟至2022年Q4季度量产查看引用信息源请点击映维网延后至Q4季度(映维网2021年10月19日)天风国际分析师郭明錤今天发文称,因工业设计,软件,生态和服务问题,苹果ARVR头显的量产时间表可能会从202苹果专利提出光学自混合传感器,实现IPD调整查看引用信息源请点击映维网用于检测光学元件位置变化的光学自混合传感器(映维网2021年10月18日)ARVR头显包含一系列的光学元件。但在使用过程中,头显中的光学元件可能会发生移位苹果专利提出利用AppleWatch进行ARVR微手势交互检测查看引用信息源请点击映维网检测皮肤接触(映维网2021年10月18日)裸手交互正越发成为VRAR的一个重要交互方式,尤其是基于腕带的裸手交互,众多科技巨头都投入了大量的资源来探索所用VR反复练习复杂手术,以色列医生为头颅连体婴成功实现分离手术查看引用信息源请点击映维网借助了虚拟现实等先进技术(映维网2021年10月15日)连体双胞胎非常罕见,而头颅连体双胞胎更是少之又少,在连体双胞胎中只有5是头颅连体双胞胎。据耶路撒冷
我们身边的汽车后市场养护与改装篇目录一汽车后市场之养护与改装二汽车的养护三汽车的改装视觉改装听觉改装性能改装四写在最后一汽车后市场之养护与改装汽车后市场这个概念相信很多朋友都听说过,但至于其真正的含义就模棱两可了中兴Axon30,屏下摄像头手机正式发布此次发布的中兴Axon305G屏下版,共有黑曜青莹轻咖素皮冠军版三色可选。具体参数方面,Axon305G屏下版采用6。92英寸AMOLED直屏,2460x1080分辨率,120Hz没有一个纸箱,能逃出楼下捡破烂大妈的眼睛你这辈子。感受过被万人敬仰追捧的感觉吗?如果没有。你明天早上上班的时候,手里拿两个空纸箱子试试。没有纸箱子,拿三五个饮料瓶也行。纸箱越大。饮料瓶越多。一拥而上,众星捧月的感觉就越触干掉前摄!小米MIX4配置曝光真全面屏200W级快充经过一段时间的沉寂后,手机圈将在8月份迎来一波新机发布潮,备受期待的小米MIX4可能也在其中。上周,小米公司Redmi产品总监王腾小米公司产品经理魏思琪转发网友微博,暗示小米即将量小鹏P7改色卡其绿,燃cool一夏最近来改色的小鹏P7真的不少,自从去年在抖音上火了以后,小鹏P7未来感的外观和性能征服的年轻车友越来越多,价格虽然在中档车位置,但是颇具豪车范儿,今天来改色的车友也是一位非常时尚的奥迪A3精美施工MOLS隐形车衣改造车型奥迪audiA3车身颜色哥特兰绿改造产品MOLS隐形车衣为什么要贴隐形车衣隐形车衣有别于传统的镀晶,打蜡等美容项目。具有完全隔绝空气氧化车漆,防止划痕产生,自动修复划痕,在摩托车界的法拉利,宝马K1600GTL施工XPEL高端隐形车衣改造车型宝马BMWK1600GTL车身颜色亮白色改造产品XPELLUX系列隐形车衣车型介绍当滂沛的动力遇上豪华装备,必然产生异乎寻常的独特结果,这就是最新面市的宝马摩托车K1600奥迪A4L变身成S4,格调满满店里来了一名95后的小伙子,需要将他的爱车(奥迪A4L)进行改装。据这位年轻车主的自述得知,小伙子也是一位汽车爱好者,经常关注汽车改装这一块的东西,年纪轻轻月入5万多,是互联网IT车身改色特斯拉Model3改色哑光黑搭配亮条粉色点缀,颜值惹眼改造车型特斯拉MODEL3车型颜色纯黑色改造产品装贴艾利铸造哑黑亮条粉色点缀特斯拉Model3,毫无疑问是现在热门的电动车选择,出色的动力性能和理想的续航表现,加上高智能的车机体验90后美女主播改色玛莎拉蒂莱万特蒂芙尼Tiffany蓝,浪漫感爆棚改造车型玛莎拉蒂莱万特车型颜色古典铜蒂芙尼Tiffany蓝改造产品艾利改色膜莱万特Levante的名字灵感来源于一股多面的地中海暖风,可以从拂面的微风瞬间爆发为强劲的狂风,充分彰显30多万买奔驰204个三叉星,到底值不值?之前成都国际汽车展组委会突然宣布延期举办车展的消息之后,不少车友哀嚎一片。不过可乐坏了宝马和奥迪这些奔驰的竞争对手。自今年4月份上海车展奔驰C级亮相之后,不少奔驰车友一直在等待着新