看下面的代码。为什么在第2行上没有警告,而我可以在没有任何错误的情况下运行它?
fun main() {
val testProducer: TestProducer<in Child> = TestProducer(22)
println(testProducer.get())
}
open class Parent
class Child : Parent()
class TestProducer<T>(private val data: T) {
fun get(): T = data
}
最佳答案
不,这不是错误。in
关键字:它使类型参数变体:它只能被使用而从不产生。
您可能会因为in
关键字的另一种常规用法而感到困惑-它位于for循环内。
这是可以使用in
关键字的所有地方:
参考-generics,keyword-reference
编辑1:
如评论中所述,
<in Child>
意味着您可以将Child对象作为函数参数传递给它。但是,当它返回像get()
函数中的对象时,它们被视为Any?
。您的代码有效,因为println
接受Any?
作为参数。