【问题标题】:How do I pass a receiver with Generic type Kotlin如何传递具有通用类型 Kotlin 的接收器
【发布时间】:2021-10-29 02:00:28
【问题描述】:

我试图弄清楚如何将具有通用类型的接收器传递给另一个函数,以尝试在该其他函数中实现必要的功能。但是,我不断收到类型不匹配错误。

我尝试过的: 尝试将第二个函数的泛型转换为相应的类型,并尝试具体化相应的泛型 T 。在这一点上,我正在为这个问题挠头。任何帮助将不胜感激

错误: 类型不匹配需要 T 找到播放器 需要类型不匹配 T 找到 NPC

问题出现在第二个函数中,其中我有带有参数 function 的 forLoop

class EntityFinder {

companion object {

    inline fun<reified T: Entity> forEach(
        radius: Int,
        entityList: List<T>,
        position: Position,
        function: (entity: T) -> Boolean
    ): Boolean {

        return false
    }

    inline fun <reified T : Entity> forEach(
        position: Position,
        radius: Int,
        function: (entity: T) -> Boolean
    ) {
        val radiusChunkSize = ceil((radius / 8.0f).toDouble()).toInt()
        val fullWidth = radiusChunkSize shl 3
        val centerX: Int = position.x
        val centerY: Int = position.y
        val centerZ: Int = position.height
        val checkPlayers = T::class.java.isAssignableFrom(Player::class.java)
        val checkNpcs = T::class.java.isAssignableFrom(NPC::class.java)
        val startX = max(0, centerX - fullWidth)
        val startY = max(0, centerY - fullWidth)
        val endX = max(0x3FFF, centerX + fullWidth)
        val endY = max(0x3FFF, centerY + fullWidth)
        for (x in startX..endX step 8) {
            for (y in startY..endY step 8) {
                val chunk = ChunkManager[Position(x, y, centerZ)] ?: continue
                if (checkPlayers) if (!forEach(radius, chunk.players, position, function)) return
                if (checkNpcs) if (!forEach(radius, chunk.npcs, position, function)) return
            }
        }
    }
}

}

【问题讨论】:

    标签: kotlin generics kotlin-reified-type-parameters


    【解决方案1】:

    问题在于,即使您检查isAssignableFrom,编译器也无法推断出任何关于T 的信息(在后续行中)。 所以你必须自己投射chunk.playerschunk.npcs。 试试这个

    if (checkPlayers) if (!forEach(radius, chunk.players as List<T>, position, function)) return
    if (checkNpcs) if (!forEach(radius, chunk.npcs as List<T>, position, function)) return
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-12
      • 2018-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-13
      • 2017-12-30
      • 2021-05-05
      相关资源
      最近更新 更多