Kotlin 泛型的 `in` 与 `out`

本文探讨了Kotlin中'in'和'out'泛型修饰符的含义和作用。'in'表示类是泛型的消费者,只接受类型而不返回;'out'则表示类是泛型的生产者,可以提供类型但不接受。这两个标记解决了Java中不同泛型间的赋值问题,实现了协变和逆协变的概念,增强了类型安全性和代码灵活性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

in 是什么

in 标明这个类是这个泛型的消费者,只进不出, 相当于 Java 的 ? super E

out 是什么

out 标明这个类是这个泛型的生产者,只出不进,相当于 Java 的 ? extends E

为什么需要这个两个标记

// 我们定义一个类
class MyList<T> {
    void add(T t){}
}
MyList<CharSequence> charSequences;
MyList<String> strings = charSequences; // 无法编译通过 
strings.add("name");

在 Java 中,这个代码是无法编译的,因为 MyList<String> 和 MyList<CharSequence>是两个不同的类型。实际上我们应该是可以这样做的,因为 MyList 只有 add 方法,你把子类型添加到父类型的集合中是没有问题的。
我们看看 kotlin 怎么解决这个问题

class MyList<in T>{
    fun add(t: T){}
}
val charSequences = MyList<CharSequence>()
val strings: MyList<String> = charSequences // 没有问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值