kotlin 实战之泛型与逆变协变总结,震惊

本文介绍了Kotlin中的泛型,包括泛型类和泛型函数的定义,以及与Java泛型的区别。文章重点讨论了Kotlin的泛型协变和逆变概念,通过实例展示了如何使用`out`和`in`关键字实现安全的数据读取和写入。此外,还提及了Java中的泛型通配符及其在协变和逆变中的应用。
摘要由CSDN通过智能技术生成

与 java 一样,kotlin 的泛型用来表示变量类型的参数化。一个简单的泛型类定义使用样例:

class Generics(t: T) {

var tmp: T = t

}

/**

运行结果:

class java.lang.String

class cn.yan.test.Generics

class java.lang.String

class cn.yan.test.Generics

*/

fun testRun() {

val generics: Generics = Generics(“666”)

println(generics.tmp.javaClass)

println(generics.javaClass)

//不像 java 没有<>就是 Object,kotlin 这里可以自动依据构造参数类型推断出是 String 类型

val generics1 = Generics(“666”)

println(generics1.tmp.javaClass)

println(generics1.javaClass)

}

一个简单的泛型函数定义如下:

//泛型函数的定义声明

fun get(t: T): T = t

/**

调用

*/

fun testRun() {

val v1 = get(“1233”)

val v2 = get(12)

val v3 = get(“1233”) //等价于v1,自动推断

}

泛型约束之协变(covariant)与逆变(controvariant)


关于泛型协变与逆变概念其实来自 java,在我们深入搞懂 kotlin 的泛型之前,我们有必要先巩固下 java 的泛型协变与逆变。以 java 代码为例子:

//【工匠若水 加微信 yanbo373131686 联系我,关注微信公众号:码农每日一题 未经允许严禁转载 https://blog.csdn.net/yanbober】

//java 代码

//表示可以往这个泛型集合放置任何类型对象

List

//表示可以往这个泛型集合只能放置String对象

List

//在 java 中不能把 List 类型变量赋值给 List,因为他们不是父子类关系

List list1 = new ArrayList();

//假设如果这么做被允许,则我们做如下代码,list2.add(new Date()); String str = list.get(0); 这会导致类型转换异常。

List list2 = list1; //编译失败

我们知道,在 java 中为了解决上面赋值问题,其提供了类型通配符的概念。如下是一个

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值