MST

星途 面试题库

面试题:Kotlin中协方差与反协方差的基础应用

在Kotlin中,假设我们有一个父类`Animal`和子类`Dog`继承自`Animal`。请使用协方差或反协方差,编写一个函数,该函数接收一个泛型类型的列表,在协方差场景下,要求能安全地从列表中取出元素并赋值给`Animal`类型变量;在反协方差场景下,要求能安全地向列表中添加`Dog`类型元素。请分别实现这两种情况,并解释你的实现原理。
23.7万 热度难度
编程语言Kotlin

知识考点

AI 面试

面试题答案

一键面试

协方差实现

open class Animal
class Dog : Animal()

// 协方差,使用out关键字
fun <T : Animal> processAnimalsOut(animals: List<out T>) {
    for (animal in animals) {
        val animalVar: Animal = animal // 可以安全地将T类型元素赋值给Animal类型变量
        println(animalVar.javaClass.simpleName)
    }
}

原理:在processAnimalsOut函数中,使用out关键字声明泛型T,表示T是一个协变类型。这意味着List<out T>可以接受T及其子类类型的列表。由于TAnimal或其某个子类,所以可以安全地将列表中的元素赋值给Animal类型变量。

反协方差实现

// 反协方差,使用in关键字
fun <T : Animal> addDogToAnimalsIn(animals: MutableList<in T>) {
    val dog = Dog()
    animals.add(dog) // 可以安全地向列表中添加Dog类型元素
}

原理:在addDogToAnimalsIn函数中,使用in关键字声明泛型T,表示T是一个反协变类型。这意味着MutableList<in T>可以接受T及其超类类型的可变列表。因为DogAnimal的子类,所以可以安全地向列表中添加Dog类型元素。