它是kotlin'in'关键字的BUG吗?

时间:2019-10-18 10:51:45

标签: generics kotlin

看下面的代码。为什么在第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
}

1 个答案:

答案 0 :(得分:1)

不,这不是bug。

<script type="text/javascript"> // Using jQuery. $(function() { $('form').each(function() { $(this).find('input').keypress(function(e) { // Enter pressed? if(e.which == 10 || e.which == 13) { this.form.submit(); } }); $(this).find('input[type=submit]').hide(); }); }); </script> 关键字:它使类型参数成为 contravariant :只能被使用而从不产生。

您可能会因为in关键字的另一种常规用法而感到困惑-该关键字位于for循环内。

这里所有可以使用in关键字的地方:

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

参考-genericskeyword-reference

编辑1:

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