Kotlin - “in”关键字 - 用于什么?

j2e*_*nue 1 kotlin

我试图了解何时在泛型中使用“in”关键字而不是“out”关键字(它允许分配给子类)。

我实际上正在关注本教程如果重要的话,。

假设我们有以下类定义:

class ParameterizedConsumer<in T> {
    fun toString(value: T): String {
        return value.toString()
    }
}
Run Code Online (Sandbox Code Playgroud)

由于不保证 value 是 String ,这甚至如何编译?这是 in 关键字的作用吗?它告诉类可以保证该类型不会是任何其他子类?我只是不清楚它的用例,你能帮忙吗?

教程说我将能够调用以下内容,但我不知道它发生了什么变化:

 val parameterizedConsumer = ParameterizedConsumer<Number>()

val ref: ParameterizedConsumer<Double> = parameterizedConsumer

assertTrue(ref is ParameterizedConsumer<Double>)
Run Code Online (Sandbox Code Playgroud)

更新:我现在明白了。Out 意味着您可以在制作时垂头丧气。“In”意味着你可以在分配时垂头丧气。

所以在java中这是不允许的:

// Java
void demo(Source<String> strs) {
  Source<Object> objects = strs; // !!! Not allowed in Java
  // ...
}
Run Code Online (Sandbox Code Playgroud)

但是在 kotlin 中,如果我们使用“out”关键字,我们可以解决这个问题,我们可以将其分配给向下转换的类(子类)。同样,使用“in”,我们可以将子类传入该类以在内部使用,但不能向外使用。

Mar*_*nik 5

它告诉类可以保证该类型不会是任何其他子类?我只是不清楚它的用例,你能帮忙吗?

假设您有一个函数想要将一些项目添加到您提供的列表中。项目的类型为Int

问题:这个函数可以接受什么样的列表?

答案:MutableList<Int>MutableList<Number>MutableList<Any>。或者,简而言之,MutableList<in Int>


本着同样的精神,让我们解释一下out投影。

假设您有一个函数想要从您提供的列表中获取一些元素。项目的类型为Future

问题:这个函数可以接受什么样的列表?

答案:List<Future>, List<RunnableFuture>, List<ScheduledFuture>... 或者,简而言之,List<out Future>