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

Kotlin泛之路

但是这种处理在我们处理泛业务时,会有很多限制,所以,泛提供了「」来拓展泛的使用。 协指的是,当参数具有父子关系时,子类可以作为参数传递,而泛的上界就是其父类。...实例化时可确定为「父类型的未知类型」,所以它「只能读不能写」,因为编译器不确定到底是哪个子类。例如下面的代码。...Kotlin让我们有了可以支持多种类型的能力,让我们有了修改泛的能力,总结来说: 泛通配符<?...reified 由于在Java会进行泛擦除,所以编译器无法在运行时知道一个确切的泛类型,也就是说,我们无法在运行时,判断一个对象是否为一个泛T的实例,例如下面的代码。...匿名内部类 匿名内部类会在运行时实例化,这个时候,就可以拿到泛的具体类型了,示例代码如下。

1.1K21

【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.5K10
您找到你想要的搜索结果了吗?
是的
没有找到

代码写明 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>>;

77930

与抗(二)

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

78120

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.2K50

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

文章目录 一、泛类 二、泛参数 三、泛型函数 四、多泛参数 五、泛类型约束 六、可变参数 vararg 关键字与泛结合使用 七、使用 [] 运算符获取指定可变参数对象 八、泛 out 协...九、泛 in 逆 十、泛 invariant 不变 十一、泛代码示例 十二、使用 reified 关键字检查泛参数类型 一、泛类 ---- 定义一个 泛类 , 将 泛参数 T...子类 AK47 类 ; 在创建 Soldier 实例对象时 , 传入 子类 AK47 类的实例对象 , 调用其重写父类的 fire 函数 ; 代码示例 : class Soldier { fun produce(): T fun consume(t: T) } 十一、泛代码示例 ---- 泛类 中 泛参数 有 子类 和 父类 , Java 语言中...( 反之就会报错 ) 如果 使用 out 关键字 , 则 范围小的子类泛对象 赋值给 范围大的 父类泛对象 ; ( 反之就会报错 ) 使用了 泛 out 协 和 泛 in 逆 极大的提高了程序的扩展性

3.6K10

Java泛的协和逆

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

62300

Java泛的协与逆

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

1.2K40

Java泛的协和逆

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

48750

Effective Kotlin 译文:Chapter3-Item24-泛

Cup 上述泛类的类型参数 T 没有指定任何变修饰符(in 或者 out), 因此默认是不的。...,父类泛是子类泛的子类,子类可以赋值给父类 } 下图演示了这种的关系: [variance.png] 函数类型 Kotlin 中,函数类型也是的,举个例子: fun printProcessedNumber...:声明处和使用处。...声明处可以作用在所有使用该泛的地方,而使用处则可以更加灵活地控制我们需要哪种。...译者注: 在 Java 中只有使用处 总结 Kotlin 有强大的泛类型,并且支持使用声明处以及使用处 默认的类型参数是不的 out 修饰符可以使类型参数协 in 修饰符可以使类型参数逆

69340

iOS 泛 ObjectType 协 __covariant 逆 __contravariant

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

3.4K40

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

return animal.Remove(a); } } AnimalHouse类型可以存放所有的动物,但是每次存入子类对象的时候就会进行装箱操作,每次取出的话,还要再次进行拆箱操作,会消耗额外的性能...二、泛约束 泛约束就是对泛(传入的类型)进行约束,约束就是指定该类型必须满足某些特定的特征,例如:可以被实例化、比如实现Animal类等等 我们来看一下官方文档上都有那些泛约束: 说明 对多个参数应用约束...,而逆就是将父类泛隐式转换为子类泛 将接口类型改为使用in关键字 public interface IAnimalHouse where T : Animal,new() { } 逆就完成了...:协时泛无法作为参数、逆时泛无法作为返回值。...思考:那么,现在你能明白上面那个错误,为什么“协时泛无法作为参数、逆时泛无法作为返回值”了吗?

6.5K30

Effective Kotlin 译文:Chapter3-Item24-泛

,父类泛是子类泛的子类,子类可以赋值给父类 } 下图演示了这种的关系: image.png 函数类型 Kotlin 中,函数类型也是的,举个例子: fun printProcessedNumber...,而函数类型的返回类型是协的: 这并不是 Kotlin 中唯一一个支持的类型,还有一个更加常见的支持协的类型就是 List(声明时使用了 out 修饰符),而 MutableList 则是不的...:声明处和使用处。...声明处可以作用在所有使用该泛的地方,而使用处则可以更加灵活地控制我们需要哪种。...译者注: 在 Java 中只有使用处 总结 Kotlin 有强大的泛类型,并且支持使用声明处以及使用处 默认的类型参数是不的 out 修饰符可以使类型参数协 in 修饰符可以使类型参数逆

56910

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

什么是泛 语法格式如下: 泛类变量名;//定义一个泛类引用 new 泛类(构造方法实参);//实例化一个泛类对象 一般用作为占位符 ,表示当前类是一个泛类...4.通配符下界(泛的逆) 我们还可以使用通配符下界(?...逆:放宽了对父类类型的泛约束,但是缺点是不能对参数进行读取数据,只能写入数据。...泛类型无法实例化类型参数T a=new T(),因为在运行时无法确定T的具体类型,也不知道T是否存在无参构造器。...无法实例化泛数组T[] arry =new T[2];因为泛最后都被擦除成Object数组,在使用时很容易发生类型转化异常,比如object转化不成string。

10310

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

60420

iOS_泛 Generics __covariant(协) __contravariant(逆)

文章目录 1、泛 `Generics` 2、`__kindof` 类型限制 3、自定义泛 4、协 和 逆 4.1、`__covariant`协 4.2、`__contravariant`逆...2、__kindof 类型限制 __kindof:类型限制 使用格式:__kindof XXClass 限制类型是:XXClass类型或XXXClass子类的实例 例1: // 返回值可以是:`UITableViewCell...`或`UITableViewCell子类`的实例 - (__kindof UITableViewCell *)dequeueReusableCellWithIdentifier:(NSString *)...identifier; 例2: // 数组里可以是:`UIView`或`UIView子类`的实例 @property (nonatomic, readonly, copy) NSArray<__kindof...名词解释: variant: 即 co + varian: 共同变化,即协的(con: 共同) contra + variant:逆,抗(contra: 相反;对立面) 例:有父类Person

84910

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

15520

Java泛详解:和Class的使用。泛类,泛方法的详细使用实例

从上面的使用时,明显可以看出泛的作用,在构造泛类的实例的时候:    [java]     view plain     copy    //IntegerPoint使用   Point<Integer...然后在使用时,就是构造一个泛类的实例的过程,使用过程也不变。    ...转自:http://blog.csdn.net/harvic880925/article/details/49872903  下面是我自己实际使用泛的几个实例。...关于泛方法的使用实例 这个地方就有2个,但是上面文章也都讲到啦。  1,一个是泛表示某一个类型的参数。为的传递某一类的参数对象  2,另一个则是传递的不是参数,而是代表Class,某一个类。...恰巧我都使用过,就正好记录一下实际使用实例

3.2K50
领券