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

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

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

1.7K10

Kotlin泛之路

但是这种处理在我们处理泛业务时,会有很多限制,所以,泛提供了「」来拓展泛的使用。 协指的是,当参数具有父子关系时,子类可以作为参数传递,而泛的上界就是其父类。...所以说,逆之后的泛,失去了读的能力(因为读出来都是Object),所以逆通常都作为「数据消费者Consumer」。...Kotlin让我们有了可以支持多种类型的能力,让我们有了修改泛的能力,总结来说: 泛通配符<?...Kotlin泛的优化 我们通过这个例子来看下Kotlin对Java泛的改进。 申明处 我们通过下面这个例子来看下Kotlin申明处的好处,这是一个生产者与消费者的例子,代码如下。...其实,编译器还是留了一,申明处的泛信息,实际上会以Signature的形式,保存到Class文件的Constant pool中,这样通过反射,就可以拿到具体的泛类型了。

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

    Kotlin 范之协、逆

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

    1.3K50

    与抗(二)

    前言   在.NET 4之前,泛接口是不变的。.NET 4通过协和抗变为泛接口和泛委托添加了一个重要的扩展。协和抗指对参数和返回值的类型进行转换。   ...这里就比较接近泛接口的协和抗的概念了。...理解泛接口的协和抗(in、out)   我们下面来看看泛接口的协及抗的例子:   首先我们看下协,在C#高级编程(第十一版)中指出,如果泛类型用out关键字标注,泛接口就是协的。...然后我们再看看那抗也可称为逆。在C#高级编程中指出的概念:如果泛类型用in关键字标注,泛接口就是抗的。这样,接口只能把泛类型T用作其方法的输入。  ...总结   其实在上述例子及其概念中,我们可以发现,泛接口的协及抗,也就是将类型参数返回或者传入的情况,在这情况下进行其类型的隐式转换所遵循的规律。

    81920

    js鼠标事件

    页面加载事件(onload),鼠标双击事件(ondbclick) window.onload=function(){                 //绑定元素,执行对应事件 鼠标双击(ondblclick...(){                     alert('我是双击显示的');                 }             } 鼠标摁下(onmousedown)事件(摁下就执行,鼠标无需抬起...}             } 鼠标抬起(onmouseup)事件(摁下后,鼠标回弹才执行)             window.onload=function(){                 ...鼠标移入(onmouseover)事件             window.onload=function(){                 //绑定元素,执行鼠标移入事件   鼠标移入(onmousemove...){                     alert('鼠标移出操作');                 }             } PS:鼠标移动(onmousemove)和鼠标移入(onmouseover

    18.2K40

    Java泛的协与逆

    导读 泛是Java最基础的语法之一,众所周知:出于安全原因,泛默认不能支持(否则会引入危险),因此Java提供了通配符上限和通配符下限来支持,其中通配符上限就泛,通配符下限就是泛...泛默认不支持 为了避免重蹈Java数组的覆辙,Java泛显然不能再继续支持默认的。...协:通配符上限 为了让泛支持,Java引入了通配符上限语法:如果A是B的子类,那么List相当于是List的子类——这种方式被称为协(covariance)。 对于支持协的泛集合,例如List的子类——这种方式被称为逆(contravariance)。 对于支持逆的泛集合,例如List<?

    1.3K40

    Java泛的协和逆

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

    69100

    Java泛的协和逆

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

    54250

    代码写明 Rust 中的泛

    代码写明 Rust 中的泛 Variance译作或可变性或变体. 表示"泛类型的子类型关系"如何从"泛参数的子类型关系"中推导....make_return_closure(str_inner)); // 类型相符 } // 强制拉长生存期 s_outer; s_static; str_outer; } Rust 泛类型的推导...Rust 泛类型不是由语法定义,而是固定的几个基础类型的可变性表, 然后组合类型 struct, enum 和 union 根据其包含域类型的可变性确定, 域类型有多种可变性时, 组合类型为不变...UnsafeCell invariant std::marker::PhantomData covariant dyn Trait + 'a covariant invariant 推导实例...推导以下代码中泛类型的 use core::ptr::NonNull; struct Node(T); type Link1 = Option>>;

    86330

    iOS 泛 ObjectType 协 __covariant 逆 __contravariant

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

    3.5K40

    js 鼠标事件总结

    当监听鼠标事件时,会触发一些事件,我们可以与之交互: mousedown 按下鼠标按钮触发 mouseup 鼠标按钮被释放 click 点击事件 dblclick 双击事件 mousemove 当鼠标移动到元素上时...,鼠标移动 mouseover 当鼠标移动到一个元素或它的一个子元素上时,鼠标悬停。...mouseenter 当鼠标移动到一个元素上时,鼠标进入。类似于mouseover但不冒泡。 mouseout 当鼠标移出元素时,以及当鼠标进入子元素时。...mouseleave 当鼠标移出一个元素时,mouseleave。类似于mouseout但不冒泡。 contextmenu 快捷菜单当快捷菜单打开时,例如用鼠标右键点击 事件重叠。...buttons 按钮(如果有),表示在任何鼠标事件上按下的按钮的数字。 clientX / clientY 无论是否滚动,鼠标指针相对于浏览器窗口的x和y坐标。

    9.1K40

    C# | 泛委托的协与逆

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

    63620

    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#高级语法之泛、泛约束,类型安全、逆和协(思想原理)

    IAnimalHouse dogHouse = new AnimalHouse(); IAnimalHouse animalHouse = dogHouse; 协的作用就是可以将子类泛隐式转换为父类泛...,而逆就是将父类泛隐式转换为子类泛 将接口类型改为使用in关键字 public interface IAnimalHouse where T : Animal,new() { } 逆就完成了...:协时泛无法作为参数、逆时泛无法作为返回值。...逆: ? 协: ? 语法都是一些 非常粗糙的东西,重要的是思想、思想、思想。然后我们来看一下为什么要有逆和协? 什么叫做类型安全?...思考:那么,现在你能明白上面那个错误,为什么“协时泛无法作为参数、逆时泛无法作为返回值”了吗?

    7K30

    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:   为什么这两个不能同时存在?

    19520
    领券