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