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

Kotlin 范型之协变、逆变

型变 型变是指类型转换后的继承关系。 Kotlin 的型变分为逆变、协变和不变。...2.2 逆变 如果 A 是 B 的子类型,并且 Generic 是 Generic 的子类型,那么 Generic 可以称之为一个逆变类。...super T> Java 的逆变通过下界通配符实现。 下面的代码因为是协变的,无法添加新的对象。...2.3 不变 默认情况下,Kotlin 中的泛型类是不变的。 这意味着它们既不是协变的也不是逆变的。 例如 MutableList,它可读可写,泛型没有使用in、out。 三....总结 本文从 Kotlin 的类、类型引出了型变。介绍了 Kotlin 的协变、协变和不变的概念和特性,以及 Java 的上界通配符、下界通配符。 该系列的相关文章: Kotlin 泛型之类型擦除

1.3K50

【Kotlin】泛型 ③ ( 泛型 out 协变 | 泛型 in 逆变 | 泛型 invariant 不变 | 泛型逆变协变代码示例 | 使用 reified 关键字检查泛型参数类型 )

文章目录 一、泛型 out 协变 二、泛型 in 逆变 三、泛型 invariant 不变 四、泛型逆变协变代码示例 五、使用 reified 关键字检查泛型参数类型 本章总结 : 使用了 泛型 out...协变 和 泛型 in 逆变 极大的提高了程序的扩展性 ; 泛型 in 逆变 : 使用 in 关键字 , 可以使 父类泛型对象 赋值给 子类泛型对象 ; 泛型 out 协变 : 使用 out 关键字 ,...; 代码示例 : 在下面的接口中 , 泛型类型 只用于作为 返回值 ; interface Producer { fun produce(): T } 二、泛型 in 逆变 ---...( 反之就会报错 ) 如果 使用 out 关键字 , 则 范围小的子类泛型对象 赋值给 范围大的 父类泛型对象 ; ( 反之就会报错 ) 使用了 泛型 out 协变 和 泛型 in 逆变 极大的提高了程序的扩展性... // 在 Consumer 中 , 使用了泛型参数 in 逆变 // 泛型参数是父类 的泛型类对象 可以赋值给 泛型参数是子类 的泛型对象 val consumer

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

    Java泛型的协变与逆变

    导读 泛型是Java最基础的语法之一,众所周知:出于安全原因,泛型默认不能支持型变(否则会引入危险),因此Java提供了通配符上限和通配符下限来支持型变,其中通配符上限就泛型协变,通配符下限就是泛型逆变...super Integer>的子类——这种型变方式被称为逆变(contravariance)。 对于支持逆变的泛型集合,例如List型逆变的集合中取出元素,那么取出的元素只能被当成Object处理(众生皆Object)。...对于更通用的泛型来说,对于支持逆变的泛型,程序只能调用以泛型为形参的方法;不能调用形参为返回值类型的方法(除非将返回值当成Object处理)。例如如下代码。...super Integer> intApp = objApp; // 逆变的泛型,调用以泛型为形参的方法,正确。

    1.3K40

    Java泛型的协变和逆变

    背景 文接上回,说到过Java的泛型擦除问题,这块我又联想到一个有意思的考点泛型的协变和逆变。...根因是Java的泛型没有协变类型,无法关联起来,也就没有关系。 利用通配符,?代表子类,T为父类。 常见的例子比如,List逆变 ,超类型限定。 逆变同样也是在各类源码中层出不穷,结合协变的理解,这块相信大家应该不难理解。 常见的例子比如,List逆变。 针对于生产者,可取,有上界;针对于消费者,可存,有下界。...小结 1、协变、逆变的区别要分清。 2、另外,再提一点泛型和通配符的区别,当然也可以结合第一点理解, 用于定义泛型类和方法,擦除后为AAA类型; <?

    54350

    iOS 泛型 ObjectType 协变 __covariant 逆变 __contravariant

    泛型使用场景: 在集合(数组、字典、NSSet)中使用泛型比较常见。 当声明一个类,类里面的某些属性的类型不确定,这时候我们才使用泛型。...泛型书写规范 在类型后面定义泛型: NSMutableArray *datas 泛型好处: 提高开发规范,减少程序员之间交流 通过集合取出来对象,直接当做泛型对象使用,可以直接使用点语法...__covariant(协变):用于泛型数据强转类型,可以向上强转,子类可以转成父类。 __contravariant(逆变):用于泛型数据强转类型,可以向下强转,父类可以转成子类。...Language : NSObject @end @interface Java : Language @end @interface iOS : Language @end 首先是没有添加协变和逆变...// __contravariant 可以逆变,父类转子类 泛型名字是ObjectType @interface Person : NSObject

    3.5K40

    iOS_泛型 Generics __covariant(协变) __contravariant(逆变)

    文章目录 1、泛型 `Generics` 2、`__kindof` 类型限制 3、自定义泛型 4、协变 和 逆变 4.1、`__covariant`协变 4.2、`__contravariant`逆变...4.2、系统类举例 1、泛型 Generics 泛型可以让你使用自定义的类型来编写灵活的、可重用的函数和类型,可以避免重复,以清晰、抽象的方式表达其意图。...__covariant(协变)或__contravariant(逆变)来控制转换关系。...(详情见下文) 4、协变 和 逆变 介绍协变和逆变前,先回顾一下:subtype、supertype: subtype、supertype是面向对象开发中最常见的类型关系,即子类型和父类型。...名词解释: variant: 即型变 co + varian: 共同变化,即协变的(con: 共同) contra + variant:逆变,抗变(contra: 相反;对立面) 例:有父类Person

    1K10

    C#泛型的逆变协变之个人理解

    方法传递任意类型的对象, 这样明显是有问题的 Q:   但是我曾经看到过 IEnumerable list = new List(); 这个为什么就可以 A:   这就要讲到C#泛型里的逆变协变了...Q:   细嗦细嗦 逆变协变 C#泛型中的逆变(in)协变(out)对于不常自定义泛型的开发来说(可能)是个很难理解的概念, 简单来说其表现形式如下 逆变(in): I = I协变(out..., 与协变相似, 需要在泛型 T 之前加上关键词 in 对比上方的协变, 逆变看起来就像是将基类赋值给子类, 但这其实符合里氏代换的 当我们调用 item.Print 时, 看起来允许传入的参数为 string...类型, 而实际上最终调用的 Face.Print 是支持 object 的, 传入 string 类型的参数没有任何问题 逆变协变的作用 逆变(in)协变(out)的作用就是扩展泛型的用法...A:   简单来说, 有关泛型输入的用逆变, 关键词是in, 有关泛型输出的用协变, 关键词是out, 如果接口中既有输入又有输出, 就不能用逆变协变 Q:   为什么这两个不能同时存在?

    20120

    C#高级语法之泛型、泛型约束,类型安全、逆变和协变(思想原理)

    ,而逆变就是将父类泛型隐式转换为子类泛型 将接口类型改为使用in关键字 public interface IAnimalHouse where T : Animal,new() { } 逆变就完成了...:协变时泛型无法作为参数、逆变时泛型无法作为返回值。...逆变: ? 协变: ? 语法都是一些 非常粗糙的东西,重要的是思想、思想、思想。然后我们来看一下为什么要有逆变和协变? 什么叫做类型安全?...所以当逆变作为参数传递时,类型是安全的。 思考:那么,现在你能明白上面那个错误,为什么“协变时泛型无法作为参数、逆变时泛型无法作为返回值”了吗?...方法 //注意,在TestIn中In方法的显示返回值肯定是Dog,但是实际上要返回的类型是Animal //所以就存在Animal类型转换为Dog类型,所以就有可能失败 //所以逆变时泛型无法作为返回值

    7.1K30

    【JavaSE】Java进阶知识一(泛型详解,包括泛型方法,协变,逆变,擦除机制)

    什么是泛型 语法格式如下: 泛型类变量名;//定义一个泛型类引用 new 泛型类(构造方法实参);//实例化一个泛型类对象 一般用作为占位符 ,表示当前类是一个泛型类...静态泛型方法:泛型类有一个局限,静态方法和静态属性访问不了类上定义的泛型参数,静态泛型方法的定义和使用与普通泛型方法一致。...泛型类和泛型方法的使用场景: 当泛型参数需要在多个方法或成员属性间扭转,就使用泛型类,比如:集合。 当泛型参数只需要作用于某个方法,那就使用泛型方法。...4.通配符下界(泛型的逆变) 我们还可以使用通配符下界(?...逆变:放宽了对父类类型的泛型约束,但是缺点是不能对参数进行读取数据,只能写入数据。

    19510

    详解全网最快Go泛型跳表【内附源码】

    导读| 今年开发者期盼已久的、泛型的go1.18发布了,但目前基于泛型的容器实现案例很稀缺。腾讯后台开发工程师陈峰实现了一套类似C++中STL的容器和算法库。...Go语言有两个不友好的点,一个是错误处理,另一个是泛型。我们调研市面上是否有类似C++中STL的泛型库,结果发现它们要么很薄弱,要么根本就不支持泛型。...于是本人写了个基于泛型的容器和算法库,名为stl4go(点击文末阅读原文,获取源码)。其中的有序 Map 没有选择红黑树,而是用了跳表。...支持自定义数据类型比较,但是不支持泛型。我们在他的基础上,做了一系列的算法和内存分配等方面的优化,并增加了迭代器、区间查找等功能。...https://cs.opensource.google/go/go/+/refs/tags/go1.19:src/math/rand/rand.go 所以我们在gostl的实现中改用了生成一个某范围内的随机数

    71730

    【Kotlin】泛型总结 ★ ( 泛型类 | 泛型参数 | 泛型函数 | 多泛型参数 | 泛型类型约束 | 可变参数结合泛型 | out 协变 | in 逆变 | reified 检查泛型参数类型 )

    九、泛型 in 逆变 十、泛型 invariant 不变 十一、泛型逆变协变代码示例 十二、使用 reified 关键字检查泛型参数类型 一、泛型类 ---- 定义一个 泛型类 , 将 泛型参数 T... { fun produce(): T fun consume(t: T) } 十一、泛型逆变协变代码示例 ---- 泛型类 中 泛型参数 有 子类 和 父类 , Java 语言中...( 反之就会报错 ) 如果 使用 out 关键字 , 则 范围小的子类泛型对象 赋值给 范围大的 父类泛型对象 ; ( 反之就会报错 ) 使用了 泛型 out 协变 和 泛型 in 逆变 极大的提高了程序的扩展性...泛型 in 逆变 , 使用 in 关键字 , 可以使 父类泛型对象 赋值给 子类泛型对象 // People 的类型是 Consumer // consumer 的类型是 Consumer... // 在 Consumer 中 , 使用了泛型参数 in 逆变 // 泛型参数是父类 的泛型类对象 可以赋值给 泛型参数是子类 的泛型对象 val consumer

    4.1K10

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

    写在前面 ---- 和小伙伴分享一些java小知识点,主要围绕下面几点: 什么是逆变(contravariant)&协变(covariant)? 数组支持协变&逆变吗? 泛型支持协变&逆变吗?...,那泛型呢?...对于协变和逆变是否支持 泛型不支持协变也不支持逆变,即不能把一个父类对象赋值给一个子类类型变量,相反也是同理。...所以直接编译报错,即泛型不支持协变也不支持逆变....,在运行期为一个具体的值.编译没有报错 Process finished with exit code 0 逆变同样也是可以,即泛型可以通过super和extends来模拟实现协变和逆变,但是本身是不存在协变和逆变的

    70710

    Category Theory: 01 One Structured Family of Structures

    ) = 单态射(monomorphism) + 满态射(epimorphism) 同构(isomorphism) = 双态射(bimorphism) + 存在逆态射 自态射(endomorphism...部分射(section) = 存在左逆 同态 = 两个数据结构之间满足分配律。...同样,不是每一个满态射都是左逆。(可能存在元素\(d_1, d_2 | d_1, d_2 \in D\)同时指向\(c | c \in C\)。) 但是,每一个右逆都是单态射,每一个左逆都是满态射。...定义:split monomorphism and split spimonomorphism 如果f有一个左逆,那么f是一个拆分单态射; 如果g有一个右逆,那么g是一个拆分满态射。...如果,对于每个\(X_j\)的乘积\(O\),有\(\pi_j : O \to X_j\), 同时需要对于任意的对象\(S\)和箭头族\(f_j : S \to X_j\),有\(u : S \to

    66330

    C#4.0新增功能03 泛型中的协变和逆变

    泛型类型参数支持协变和逆变,可在分配和使用泛型类型方面提供更大的灵活性。 在引用类型系统时,协变、逆变和不变性具有如下定义。...未标记为协变或逆变的泛型类型参数称为“固定参数” 。...Func 泛型委托的最后一个泛型类型参数指定委托签名中返回值的类型。 该参数是协变的(out 关键字),而其他泛型类型参数是逆变的(in 关键字)。 下面的代码阐释这一点。...然后,使用泛型类型参数的协变和逆变,将得到的泛型委托指派给另一个变量,此变量的泛型委托类型的参数类型为 Type3 ,返回类型为 Type1。...也可以将逆变类型参数用作接口方法的泛型类型约束。 只有接口类型和委托类型才能具有 Variant 类型参数。 接口或委托类型可以同时具有协变和逆变类型参数。

    1.3K20

    219个opencv常用函数汇总

    cvGetSize:得到二维的数组的尺寸,以CvSize返回; 52、cvGetSubRect:从一个数组的子区域复制元素值; 53、cvInRange:检查一个数组的元素是否在另外两个数组中的值的范围内;...54、cvInRangeS:检查一个数组的元素的值是否在另外两个标量的范围内; 55、cvInvert:求矩阵的逆; 56、cvMahalonobis:计算两个向量间的马氏距离; 57、cvMax:在两个数组中进行元素级的取最大值操作...119、cvReadIntByName:读取一个有名称的整数型; 120、cvReadReal:读取一个无名称的浮点型; 121、cvReadRealByName:读取一个有名称的浮点型; 122、cvReadString...; 157、cvGetQuadrangleSubPix:仿射变换; 158、cvGetAffineTransform:仿射映射矩阵的计算; 159、cvCloneImage:将整个IplImage结构复制到新的...IplImage中; 160、cv2DRotationMatrix:仿射映射矩阵的计算; 161、cvTransform:稀疏仿射变换; 162、cvWarpPerspective:密集透视变换(单应性

    3.5K10
    领券