Kotlin 面试题
目录

Kotlin 中协变 (Covariance) 和逆变 (Contravariance) 的概念是什么?

· 约 3 分钟读完 · 第 103 / 200 章

推荐答案

在 Kotlin 中,协变(Covariance)和逆变(Contravariance)是泛型类型系统中的重要概念,用于描述泛型类型参数之间的继承关系。

  • 协变(Covariance):允许子类型替换父类型。在 Kotlin 中,使用 out 关键字表示协变。协变通常用于只读场景,例如生产者(Producer),即只能从泛型类型中读取数据,而不能写入数据。

  • 逆变(Contravariance):允许父类型替换子类型。在 Kotlin 中,使用 in 关键字表示逆变。逆变通常用于只写场景,例如消费者(Consumer),即只能向泛型类型中写入数据,而不能读取数据。

本题详细解读

协变(Covariance)

协变允许子类型替换父类型。在 Kotlin 中,协变通过 out 关键字实现。协变通常用于只读场景,例如生产者(Producer),即只能从泛型类型中读取数据,而不能写入数据。

在上面的例子中,Box<String> 是 Box<Any> 的子类型,因为 String 是 Any 的子类型。通过使用 out 关键字,Box 类被声明为协变的,因此可以将 Box<String> 赋值给 Box<Any>。

逆变(Contravariance)

逆变允许父类型替换子类型。在 Kotlin 中,逆变通过 in 关键字实现。逆变通常用于只写场景,例如消费者(Consumer),即只能向泛型类型中写入数据,而不能读取数据。

在上面的例子中,Box<Any> 是 Box<String> 的子类型,因为 Any 是 String 的父类型。通过使用 in 关键字,Box 类被声明为逆变的,因此可以将 Box<Any> 赋值给 Box<String>。

总结

  • 协变(Covariance):使用 out 关键字,允许子类型替换父类型,适用于只读场景。
  • 逆变(Contravariance):使用 in 关键字,允许父类型替换子类型,适用于只写场景。

通过理解协变和逆变,可以更好地设计和使用泛型类型,确保类型安全并提高代码的灵活性。