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

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

文章目录 一、泛型 out 协变 二、泛型 in 逆变 三、泛型 invariant 不变 四、泛型逆变协变代码示例 五、使用 reified 关键字检查泛型参数类型 本章总结 : 使用了 泛型 out...协变 和 泛型 in 逆变 极大的提高了程序的扩展性 ; 泛型 in 逆变 : 使用 in 关键字 , 可以使 父类泛型对象 赋值给 子类泛型对象 ; 泛型 out 协变 : 使用 out 关键字 ,...作为 函数的返回值 类型 , 则在 声明 泛型参数 类型 时 , 在 泛型参数 前 使用 out 关键字 , 同时 该 泛型类 又称为 生产类 ( 生产接口 ) , 用于生产 泛型类 指定的泛型对象...泛型类型 作为 函数的返回值 类型 , 则在 声明 泛型参数 类型 时 , 既不使用 in 关键字 , 又不使用 out 关键字 ; 代码示例 : 在下面的接口中 , 泛型类型 即用于作为 返回值 ,...( 反之就会报错 ) 如果 使用 out 关键字 , 则 范围小的子类泛型对象 赋值给 范围大的 父类泛型对象 ; ( 反之就会报错 ) 使用了 泛型 out 协变 和 泛型 in 逆变 极大的提高了程序的扩展性

1.7K10

C# | 泛型委托的协变与逆变

协变 协变: 当类型参数仅用作输出(即返回值)时,可将类型参数标记为 out 这样就允许 Del dogMaker = MakeDog; // MakeDog是一个返回Dog匹配委托的方法...Animal , 而其指向的 Del 返回了 Dog , Dog 是 Animal 的派生类,接受返回 Dog ,于是可以,调用代码可以自由的操作返回的对象的 Animal 部分 逆变 逆变...: 当类型参数仅用作输入(作为方法的参数类型),可将类型参数标记为in 这样就允许 Del animal =ActOnAnimal; // ActOnAnimal为匹配此委托的方法 Del...Dog ,于是又传入了其指向了 Del , 于是传入 Del 了一个Animal的派生类Dog 这种在期望传入基类 时允许传入派生对象 的特性叫做逆变...本文作者: yiyun 本文链接: https://moeci.com/posts/2022/01/CSharp-泛型委托的协变与逆变/ 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA

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

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

    一般来说, 泛型的作用就类似一个占位符, 或者说是一个参数, 可以让我们把类型像参数一样进行传递, 尽可能地复用代码。...object> list = new List(); 这个为什么就可以 A:   这就要讲到C#泛型里的逆变协变了 Q:   细嗦细嗦 逆变协变 C#泛型中的逆变(in)协变(out)对于不常自定义泛型的开发来说..., 可以进行符合直觉且和谐的转化 前编中提到的代码例子不适用并且也不能改造成协变, 只适合使用逆变 相比于符合直觉且和谐的协变, 逆变是不符合直觉并且别扭的 IFace item = new...类型, 而实际上最终调用的 Face.Print 是支持 object 的, 传入 string 类型的参数没有任何问题 逆变协变的作用 逆变(in)协变(out)的作用就是扩展泛型的用法...A:   简单来说, 有关泛型输入的用逆变, 关键词是in, 有关泛型输出的用协变, 关键词是out, 如果接口中既有输入又有输出, 就不能用逆变协变 Q:   为什么这两个不能同时存在?

    20120

    Java泛型的协变和逆变

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

    72600

    Java泛型的协变与逆变

    导读 泛型是Java最基础的语法之一,众所周知:出于安全原因,泛型默认不能支持型变(否则会引入危险),因此Java提供了通配符上限和通配符下限来支持型变,其中通配符上限就泛型协变,通配符下限就是泛型逆变...对于更通用的泛型来说,对于支持协变的泛型,程序只能调用以泛型为返回值类型的方法;不能调用形参为泛型的方法。例如如下代码。...extends Number> numApp = intApp; // 协变的泛型,调用以泛型为返回值的方法,正确。...extends Number>也是支持协变的泛型,因此该类型的变量只能调用返回值为泛型的方法,不能调用形参为泛型的方法——如上①号代码所示。...对于更通用的泛型来说,对于支持逆变的泛型,程序只能调用以泛型为形参的方法;不能调用形参为返回值类型的方法(除非将返回值当成Object处理)。例如如下代码。

    1.3K40

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

    文章目录 一、泛型类 二、泛型参数 三、泛型函数 四、多泛型参数 五、泛型类型约束 六、可变参数 vararg 关键字与泛型结合使用 七、使用 [] 运算符获取指定可变参数对象 八、泛型 out 协变...九、泛型 in 逆变 十、泛型 invariant 不变 十一、泛型逆变协变代码示例 十二、使用 reified 关键字检查泛型参数类型 一、泛型类 ---- 定义一个 泛型类 , 将 泛型参数 T...八、泛型 out 协变 ---- 使用 out 关键字 , 可以使 子类泛型对象 赋值给 父类泛型对象 ; 在 泛型类 中 , 如果只将 泛型类型 作为 函数的返回值 类型 , 则在 声明 泛型参数...( 反之就会报错 ) 如果 使用 out 关键字 , 则 范围小的子类泛型对象 赋值给 范围大的 父类泛型对象 ; ( 反之就会报错 ) 使用了 泛型 out 协变 和 泛型 in 逆变 极大的提高了程序的扩展性...泛型 out 协变 , 使用 out 关键字 , 可以使 子类泛型对象 赋值给 父类泛型对象 // FoodFactory 是 Producer 子类 , 类型正好匹配 val

    4.1K10

    泛型协变与抗变(二)

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

    82020

    Java泛型的协变和逆变

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

    54350

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

    一、为什么使用泛型?...} //泛型类中具体使用CName //返回值为CName并且接受一个类型为CName类型的对象 public CName GetC(CName c) {...:协变时泛型无法作为参数、逆变时泛型无法作为返回值。...协变的话我相信应该很好理解,将子类转换为父类,兼容性好,解决了类型安全(因为子类转父类是肯定可以转换成功的);而协变作为返回值是百分百的类型安全 “逆变为什么又是解决了类型安全呢?子类转父类也安全吗?...所以当逆变作为参数传递时,类型是安全的。 思考:那么,现在你能明白上面那个错误,为什么“协变时泛型无法作为参数、逆变时泛型无法作为返回值”了吗?

    7.1K30

    iOS 泛型 ObjectType 协变 __covariant 逆变 __contravariant

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

    3.5K40

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

    文章目录 1、泛型 `Generics` 2、`__kindof` 类型限制 3、自定义泛型 4、协变 和 逆变 4.1、`__covariant`协变 4.2、`__contravariant`逆变...4.2、系统类举例 1、泛型 Generics 泛型可以让你使用自定义的类型来编写灵活的、可重用的函数和类型,可以避免重复,以清晰、抽象的方式表达其意图。...2、__kindof 类型限制 __kindof:类型限制 使用格式:__kindof XXClass 限制类型是:XXClass类型或XXXClass子类的实例 例1: // 返回值可以是:`UITableViewCell...默认不加泛型修饰类型的情况下,不同类型的泛型可以互相转换: MOCollection *collection; MOCollection *string_collection;...(详情见下文) 4、协变 和 逆变 介绍协变和逆变前,先回顾一下:subtype、supertype: subtype、supertype是面向对象开发中最常见的类型关系,即子类型和父类型。

    1K10

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

    2.泛型方法 泛型方法:定义一个泛型方法,我们需要在方法返回值前使用尖括号声明一个或多个泛型参数然在方法中就可以用到声明的泛型参数了,调用泛型方法时,我们不需要手动写出类型,编译器会根据你的调用,自动推导出具体类型...3.通配符上界(泛型的协变) 泛型类型是具有不变性的,比如下面代码就是错误的: Arraylist objectList; ArrayList stringList =...(); } return result; } List doubleList = new ArrayList(); sum(doubleList) 这种写法也被叫做泛型的协变...4.通配符下界(泛型的逆变) 我们还可以使用通配符下界(?...: 协变:放宽了对子类类型的泛型约束,但是缺点是不能对调用的参数进行写入数据只能进行读取数据。

    19510

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

    对于协变和逆变是否支持 泛型不支持协变也不支持逆变,即不能把一个父类对象赋值给一个子类类型变量,相反也是同理。...,必须保证泛型参数类型是固定的,所以它不允许一个泛型参数可以同时包含两种类型,即使为父子关系也不行。...所以直接编译报错,即泛型不支持协变也不支持逆变....super Integer> li = new ArrayList(); 关于协变逆变就和小伙伴分享到这里,嗯,还有协变逆变方法,这里要简单说明下 协变方法: 即子类的方法返回值的类型比父类方法要窄...//子类的doStuff()方法返回值的类型比父类方法要窄,即该方法为协变方法,也称多态。

    70710

    泛型类、泛型方法、类型通配符的使用

    泛型类、泛型方法、类型通配符的使用 一.泛型类        泛型类的声明和非泛型类的声明类似,除了在类名后面添加了类型参数声明部分...和泛型方法一样,泛型类的类型参数声明部分也包含一个或多个类型参数,参数间用逗号隔开。一个泛型参数,也被称为一个类型变量,是用于指定一个泛型类型名称的标识符。...下面是定义泛型方法的规则: 所有泛型方法声明都有一个类型参数声明部分(由尖括号分隔),该类型参数声明部分在方法返回类型之前(在下面例子中的)。...类型参数能被用来声明返回值类型,并且能作为泛型方法得到的实际参数类型的占位符。 泛型方法体的声明和其他方法一样。...下面的例子演示了"extends"如何使用在一般意义上的意思"extends"(类)或者"implements"(接口)。该例子中的泛型方法返回三个可比较对象的最大值。

    3.8K40

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

    泛型类型参数支持协变和逆变,可在分配和使用泛型类型方面提供更大的灵活性。 在引用类型系统时,协变、逆变和不变性具有如下定义。...Invariance 这意味着,你只能使用原始指定的类型;固定泛型类型参数既不是协变类型,也不是逆变类型。...对于接口,协变类型参数可用作接口的方法的返回类型,而逆变类型参数可用作接口的方法的参数类型。 协变和逆变统称为“变体” 。 未标记为协变或逆变的泛型类型参数称为“固定参数” 。...然后,使用泛型类型参数的协变和逆变,将得到的泛型委托指派给另一个变量,此变量的泛型委托类型的参数类型为 Type3 ,返回类型为 Type1。...Visual Basic 和 C# 不允许违反协变和逆变类型参数的使用规则,也不允许将协变和逆变批注添加到接口和委托类型之外的类型参数中。

    1.3K20

    Kotlin泛型的型变之路

    但是这种处理在我们处理泛型业务时,会有很多限制,所以,泛型提供了「型变」来拓展泛型的使用。 协变 协变指的是,当参数具有父子关系时,子类可以作为参数传递,而泛型的上界就是其父类。...在学习了Java泛型之后,我们再来看下Kotlin的泛型,这时候你再看,就没那么复杂了,核心就两条。 使用关键字 out 来支持协变,等同于 Java 中的上界通配符 ?...T只会用来输出时,可以在申明类的时候,直接使用协变约束,这样在调用的时候,就不用额外使用协变了,当然写了也不会错。...,是很大开源库中都在使用的方式,例如Retrofit,它在内部就是通过method.genericReturnType来获取泛型的返回类型,通过method.genericParameterTypes来获取泛型的参数类型...那么我们在实际的代码中,要在哪些场景使用协变和逆变呢?通常来说,泛型参数协变后则表示——「这个参数在当前类中,只能作为函数的返回值,或者是只读属性」。

    1.2K21
    领券