Generics 这是kotlin';在';关键词?
请看下面的代码。为什么在第2行没有警告,我可以运行它而没有任何错误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) {
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?
作为参数。