首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

JAVA冷知识】什么(contravariant)&(covariant)?数组支持&逆吗?泛型呢?

写在前面 ---- 和小伙伴分享一些java小知识点,主要围绕下面几点: 什么(contravariant)&(covariant)? 数组支持&逆吗? 泛型支持&逆吗?...下面们结合代码就数组和泛型的和逆进行分析 我们来看一段代码 package com.liruilong; import java.util.Arrays; /** * @Project_name...,这些封装类可以出现在Number类定义的数组中,说明子类可以替换了父类,即数组满足协的。...Object类,即所有类的父类,希望可以通过父类来覆盖代替子类,但是直接编译报错,说明数组不支持直接逆的 Error:(17, 30) java: 不兼容的类型: java.lang.Object...说明对于数组的逆变来讲,不支持逆的,将父类强制转化为子类报类型转化异常,java并没有对这方面做限制。

61410
您找到你想要的搜索结果了吗?
是的
没有找到

Java泛型的和逆

背景 文接上回,说到过Java的泛型擦除问题,这块我又联想到一个有意思的考点泛型的和逆。...一、 首先Java数组的,所以假设AB的父类,那么A[]可以保存A或者B的对象的,并且A[]B[]的父类。 ,写谁都会写,子类型限定。...根因Java的泛型没有类型,无法关联起来,也就没有关系。 利用通配符,?代表子类,T为父类。 常见的例子比如,List<?...通俗理解生产者为,消费者为逆。 针对于生产者,可取,有上界;针对于消费者,可存,有下界。...理解它,也可以通过Java的继承关系, 假设存在继承关系Object-》T、T-》A、T-》B; 即T为A、B的父类,面向子类;逆面向Object,它是所有对象的父类。

62400

Java泛型的与逆

导读 泛型Java最基础的语法之一,众所周知:出于安全原因,泛型默认不能支持型(否则会引入危险),因此Java提供了通配符上限和通配符下限来支持型,其中通配符上限就泛型,通配符下限就是泛型逆...由于来自早期的设计,所以Java数组默认就支持型(Variance):只要AB的子类,那么A[]就相当于B[]的子类,比如IntegerNumber的子类,因此Integer[]就相当于Number...泛型默认不支持型 为了避免重蹈Java数组的覆辙,Java泛型显然不能再继续支持默认的型。...:通配符上限 为了让泛型支持型Java引入了通配符上限语法:如果AB的子类,那么List相当于是List<?...总结来说,支持的集合只能取出元素,不能添加元素——疯狂Java讲义归纳的口诀只出不进!

1.2K40

Java泛型的和逆

背景 文接上回,说到过Java的泛型擦除问题,这块我又联想到一个有意思的考点泛型的和逆。...一、 首先Java数组的,所以假设AB的父类,那么A[]可以保存A或者B的对象的,并且A[]B[]的父类。 ,写谁都会写,子类型限定。...根因Java的泛型没有类型,无法关联起来,也就没有关系。 利用通配符,?代表子类,T为父类。 常见的例子比如,List<?...通俗理解生产者为,消费者为逆。 针对于生产者,可取,有上界;针对于消费者,可存,有下界。...理解它,也可以通过Java的继承关系, 假设存在继承关系Object-》T、T-》A、T-》B; 即T为A、B的父类,面向子类;逆面向Object,它是所有对象的父类。

48750

、逆与不变

Java 中,数组的,也就是说,假设有一个基类 Person 和一个 Person 的子类 Student。...也就是说,给数组的单元赋值的时候出错了。这个错误本来应该由编译器发现并指出,但 Java 将对这一错误的防止延后到了运行时期,错过了编译期的检查。...在 Java 的早期版本中,工程师们因为时间紧迫而选择暂时不添加泛型在 Java 的语法中,这导致 Java数组没法使用泛型,在这种情况下,如果数组的型不变,那么要写一些通用的数组操作方法就变得困难...语义与的情况类似的。 于是,Scala 和 Java 的型标记可以进行如下总结 3: Scala Java 解释 +T ?...而 get 方法的类型显然 () => T。所以从单元中获取元素这个操作上来看,数组在其元素的类型上

1.7K30

C#和逆

msdn 解释如下:  “指能够使用与原始指定的派生类型相比,派生程度更大的类型。  “逆”则是指能够使用派生程度更小的类型。  解释的很正确,大致就是这样,不过不够直白。 ...上面个人对和逆的理解,比起记住那些派生,类型,原始指定,更大,更小之类的词语,个人认为要容易点。 ...正因如此,所以微软新增了两个关键字:Out,In,下面他们的msdn解释: 的英文:“covariant”,逆的英文:“Contravariant” 为什么Microsoft选择的”Out...我个人的理解: 因为和逆的英文太复杂了,并没有体现和逆的不同,但是out 和 in 却很直白。...想要回答这个问题需要在回头看看Clr via C# 关于泛型和接口的章节了,我就不解释了,  答案不可以。  上面演示的,接下来要演示下逆

91930

”、“逆”与Delegate类型转换

之后又想到了其他一些相关的东西,除了简单地分析如何通过Emit实现EventHandler的类型转换之外,还加上关于Delegate“”与“逆”的一些东西,算是对前一篇文章的完善。...目录 一、从Delegate的“”与“逆”说起 二、EventHandler是否换一种定义方式更好?...四、通过Emit实现EventHandler的类型转换 五、最简单的转换方式 一、从Delegate的“”与“逆”说起 根据Delegate“”与“逆”的原理,对于两个具有相同声明的两个...我们在定义泛型Delegate的时候可以利用C#“”与“逆”,使类型为A对象能够赋值给类型为B的变量。...EventArgs e); 2: public delegate void EventHandler(object sender, TEventArgs e); 根据Delegate“

80470

泛型与抗(二)

前言   在.NET 4之前,泛型接口不变的。.NET 4通过和抗变为泛型接口和泛型委托添加了一个重要的扩展。和抗指对参数和返回值的类型进行转换。   ...我们来看下到底什么什么: 如果某个返回的类型可以由其基类替换,那么这个类型就是支持的   如果某个参数类型可以由其派生类替换,那么这个类型就是支持逆(抗)的。...这里就比较接近泛型接口的和抗的概念了。...理解泛型接口的和抗(in、out)   我们下面来看看泛型接口的及抗的例子:   首先我们看下,在C#高级编程(第十一版)中指出,如果泛型类型用out关键字标注,泛型接口就是的。...:(使用关键字out)返回类型可以由其基类所替代的时候,就是支持的。     抗(逆):(使用关键字in)传入参数类型可以由其派生类所代替的时候,就是支持抗(逆)的。

78120

C#进阶-与逆

我们知道子类转换到父类,在C#中能够隐式转换的。这种子类到父类的转换就是。而另外一种类似于父类转向子类的变换,可以简单的理解为逆。...,f(x)表示类型转换,≤表示继承关系(比如,A≤B表示A由B派生出来的子类) 当A≤B时,若f(x)的,则f(B)≤f(A)成立; 当A≤B时,若f(x)的,则f(A)≤f(B)成立;...令List成为List子类的变化,我们叫做,和string与Object的父子关系相同的;反之,令List成为List子类的变化,我们叫做逆...,和string与Object的父子关系相反的; 和逆能够实现数组类型、委托类型和泛型类型参数的隐式引用转换。...//数组-逆 //数组使派生程度更大的类型的数组能够隐式转换为派生程度更小的类型的数组

8810

Swift 之类型的与逆

—沃茨•其索特 1 什么与逆 刚开始看到(Covariance)和逆(Contravariance)的时候,差点晕菜,反复查了一些资料,才稍有些自己的体会,难免有理解不对的地方,欢迎指出...那么我们就可以这么来解释和逆变了: : 如果说 List 也是 List的subtype,也就是衍生类型的关系和原来类型( Cat 与 Animal)的关系一致的,那我们就说...List 和它的原来类型(共同变化)的。...2 为什么要了解与逆?...也就是说函数的参数的。 得到的结论: 函数的参数的,返回值的。 我们知道了变化的规则,就能判断出类型的关系,就可以知道一个类型是否可以替换另外一个类型。

83320

了解C#的和逆

前言 在引用类型系统时,、逆和不变性具有如下定义。 这些示例假定一个名为 Base 的基类和一个名为 Derived的派生类。...固定泛型类型参数既不是,也不是逆。 你无法将 List 的实例分配给 List 类型的变量,反之亦然。 以上来自于官方文档对、逆、不变性的解释 为啥C#需要和逆?...在C#中,目前只有泛型接口和泛型委托可以支持和逆(Covariance) 内置的泛型接口,IEnumerator、IQuerable、IGrouping<Tkey, TElement...、方法或者委托的输入参数 当要进行类型转换,占位符T要转换的目标类型也必须其子类,上述例子则是FooBase转为Foo 总结 和逆只对泛型委托和泛型接口有效,对普通的泛型类和泛型方法无效 和逆的类型必须引用类型...,因为值类型不具备继承性,因此类型转换存在不兼容性 泛型接口和泛型委托可同时存在和逆的类型参数,即占位符T 参考 泛型中的和逆 | Microsoft Docs 《你必须知道的.NET(第2

88310

Java基础知识:泛型的类型擦除、逆

image.png 因此 Number 类型的 filter 过滤类可以认为之后的 Double 类型的 Filter 的子类型。...通过逆,可以让泛型的约束变得更加宽松。 与不同,逆放宽的对父类的约束,而放宽的对子类的约束。 但同样,逆放宽类型约束存在一定代价的: List<?...再也无法从函数返回值中得到这个繁星的类型 Double number = list.get(0); //编译不通过 Object number = list.get(0); //只能作为顶层级的Object类 泛型的使用的...extends 通配符,使得子类型的泛型对象可以进行赋值,但同样会失去调用 add 存储功能时传递该泛型对象的能力: //泛型的 List list = new ArrayList(); list.get(0); //无法进行get 逆的使用场景: 当一个对象只作为泛型的生产者,也就是只取泛型的情况下

64330

编程小知识之和逆

本文简述了 C# 中和逆的一些知识 在 C# 中, 和 逆 能够实现 数组类型 和 委托类型 的隐式引用转换, .NET Framework 4 (包括)以后, C# 也开始支持在...泛型接口 和 泛型委托 中使用和逆,下面的内容也主要围绕泛型类型参数的和逆变来进行讲解....什么? 所谓(Covariance),指能够使用比原始指定的类型派生程度更大的类型,简单理解就是 子类转为父类 这种变化....小结: 和逆用于隐式引用转换 的关键字为 out,被其修饰的参数类型只能用于输出参数 逆的关键字为 in,被其修饰的参数类型只能用于输入参数 子类总是可以安全的转为父类保证和逆类型安全的统一前提...参考资料 和逆 (C#) 泛型中的和逆 深入理解 C# 和逆 理解 C# 泛型接口中的与逆

88630

c# 和逆的理解

是什么 1.1 指能够使用比原始指定的派生类型的派生程度更小(不太具体的)的类型。如 string 到 object 的转换。多见于类型参数用作方法的返回值。...泛型类型参数支持和逆,可在分配和使用泛型类型方面提供更大的灵活性。 2....数组也继承了这一特性,对于一个string[]类型而言 理解了上述概念后,让我们来看看和逆的概念,这里我们只谈谈关于接口可变性中的一些内容。以下我简单给出一个接口及其实现。...所以归根到底,和逆只是一种约束而已,这种规范限制了你的泛型接口中要么只能有将类型参数当作返回值的变相容方法(加了 out 关键字),要么只能有将类型参数当作输入值的逆变相容方法(加了 in 关键字...本文针对的和逆存在部分理解但是仍然有些迷糊的开发者群体,而笔者也忙于新技术的理解和投入使用,有段时间没能分享所学所得,这次也只是花了十几分钟撷取了重要概念记录答疑,希望能帮到一部分人,以上就是我的期望了

1.4K60
领券