MST

星途 面试题库

面试题:Kotlin逆变协变在自定义泛型类中的应用

定义一个Kotlin泛型类 `Box<T>` 用于存放数据。现在要求你通过类型参数的逆变协变特性,实现一个函数 `fun transfer(from: Box<in String>, to: Box<out Any>)`,将 `from` 盒子中的数据转移到 `to` 盒子中,并解释你所使用的逆变协变原理。
32.3万 热度难度
编程语言Kotlin

知识考点

AI 面试

面试题答案

一键面试
class Box<T>(var value: T)

fun transfer(from: Box<in String>, to: Box<out Any>) {
    to.value = from.value
}

逆变协变原理解释

  1. 逆变(in关键字):在Box<in String>中,in关键字表示类型参数T是逆变的。这意味着Box类型可以接受String类型或者String的超类型。在这里,Box类型可以接受任何能赋值给String的类型,包括String本身。逆变允许我们从一个更具体的类型(如String)转换到一个更通用的类型(如Any)作为参数传递,它主要用于输入参数类型。
  2. 协变(out关键字):在Box<out Any>中,out关键字表示类型参数T是协变的。这意味着Box类型可以提供Any类型或者Any的子类型。在这里,Box类型可以提供任何能从Any赋值的类型,包括String。协变允许我们从一个更通用的类型(如Any)转换到一个更具体的类型(如String)作为返回值,它主要用于返回值类型。通过这样的定义,函数transfer可以安全地将from盒子中的String类型数据转移到to盒子中,因为StringAny的子类型,满足协变逆变的规则。