Kotlin语法问题

时间:2019-07-10 16:40:35

标签: kotlin

对不起,标题很糟糕,但是我似乎找不到允许的方法问这个问题,因为我不知道如何引用我正在查看的代码结构。

正在查看此文件:https://github.com/Hexworks/caves-of-zircon-tutorial/blob/master/src/main/kotlin/org/hexworks/cavesofzircon/systems/InputReceiver.kt

我不明白这是怎么回事:

    override fun update(entity: GameEntity<out EntityType>, context: GameContext): Boolean {
    val (_, _, uiEvent, player) = context

我能理解一些事情。

我们将覆盖行为类(该类的超类)中定义的更新函数。

更新功能接受两个参数。一个名为GameEntity的实体,一个名为GameContext的上下文。

该函数返回布尔结果。

但是,我根本不理解下一行。只需打开和关闭括号,两个下划线作为前两个参数,然后分配给context参数即可。我们将上下文的值分配给什么?

基于IDE行为,显然开/关括号与GameContext的构造函数有关。但是我不知道那样。我也不明白参数列表中下划线的含义。

最后,我已经阅读了有关声明站点差异关键字“ out”的信息,但实际上我并不明白这意味着什么。我们有GameEntity 。因此,据我了解,这意味着此方法产生EntityType,但不使用它。这段代码中如何显示?

2 个答案:

答案 0 :(得分:2)

val (_, _, uiEvent, player) = context

您正在从上下文中提取第3个和第4个值,而忽略了前两个。

比较https://kotlinlang.org/docs/reference/multi-declarations.html

关于out:我看不到您显示的代码段中正在使用它。您可能想要显示完整的方法。 另外,也许它仅仅是为了覆盖方法,以匹配函数的签名。

答案 1 :(得分:0)

要掩盖Incubbus本来无法回答的一点点问题:

在声明中

override fun update(entity: GameEntity<out EntityType>, // …

out意味着您可以调用该函数并传递一个GameEntity<SubclassOfEntityType>(甚至是一个SubclassOfGameEntity<SubclassOfEntityType>)。

没有out的情况下,您必须通过GameEntity<EntityType>(或SubclassOfGameEntity<EntityType>)。

我猜这是从您要重写的超类方法继承的。毕竟,如果可以使用GameEntity<SubclassOfEntityType>来调用超类方法,那么您的覆盖也将需要处理它。 (Liskov substitution principle发挥了作用!)