Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Generics 这是kotlin';在';关键词?_Generics_Kotlin - Fatal编程技术网

Generics 这是kotlin';在';关键词?

Generics 这是kotlin';在';关键词?,generics,kotlin,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) {

请看下面的代码。为什么在第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
}
fun main(){
val testProducer:testProducer=testProducer(22)
println(testProducer.get())
}
开放类父类
类子级:父级()
类TestProducer(专用val数据:T){
fun get():T=data
}
不,这不是一个bug

in
关键字:它生成一个类型参数反变:它只能被消费,不能被生产

您可能会感到困惑,因为关键字中的
的另一个常用用法是for循环

以下是
关键字中可以使用的所有位置

  • 指定在for循环中迭代的对象
  • 用作中缀运算符,用于检查值是否属于定义“contains”方法的范围、集合或其他实体
  • 在用于相同目的的when表达式中使用
  • 将类型参数标记为逆变
参考文献-

编辑1:

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

但是如果我将
in
更改为
out
,将出现类型不匹配错误。这是故意的吗?是的,因为
out
会将类型参数标记为协方差,所以在这个问题中
TestProducer
等于
TestProducer
。代码检查不会检查您指定的泛型类型。是吗?
意味着您可以将子对象作为函数参数传递给它。但是当它返回类似于
get()
函数中的对象时,它们将被视为
Any?
。您的代码之所以有效,是因为
println
接受
Any?
作为参数。