MST

星途 面试题库

面试题:Kotlin中协变与逆变的基础应用

在Kotlin中,假设有一个`Animal`类及其子类`Dog`和`Cat`,定义一个`List`相关的场景,说明如何使用协变(`out`关键字)来保证类型安全并实现相关功能。
12.5万 热度难度
编程语言Kotlin

知识考点

AI 面试

面试题答案

一键面试
  1. 定义类层次结构
    open class Animal
    class Dog : Animal()
    class Cat : Animal()
    
  2. 使用协变(out关键字)的场景: 假设有一个函数,它需要接受一个包含Animal子类对象的列表,并且只从这个列表中读取数据(而不是写入数据)。这时可以使用协变。
    fun printAnimals(animals: List<out Animal>) {
        for (animal in animals) {
            println(animal)
        }
    }
    
  3. 调用函数
    fun main() {
        val dogs: List<Dog> = listOf(Dog(), Dog())
        val cats: List<Cat> = listOf(Cat(), Cat())
        printAnimals(dogs)
        printAnimals(cats)
    }
    

在上述代码中,printAnimals函数接受一个List<out Animal>类型的参数。out关键字使得这个函数可以接受List<Dog>List<Cat>Animal子类的列表。因为函数只读取列表中的元素(println(animal)),使用协变保证了类型安全,避免了将不兼容类型的数据写入列表可能导致的错误。如果没有out关键字,printAnimals函数只能接受List<Animal>,而不能接受List<Dog>List<Cat>