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