看下面的代码。为什么在第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关键字的所有地方:

  • 指定要在for循环中迭代的对象
  • 用作中缀运算符,以检查值是否属于范围,集合或定义“包含”方法的另一个实体
  • 用于表达式出于相同目的
  • 将类型参数标记为逆向

  • 参考-genericskeyword-reference

    编辑1:

    如评论中所述,<in Child>意味着您可以将Child对象作为函数参数传递给它。但是,当它返回像get()函数中的对象时,它们被视为Any?。您的代码有效,因为println接受Any?作为参数。

    10-08 18:50