我如何传递具有通用类型 Kotlin 的接收器

How do I pass a receiver with Generic type Kotlin

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

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

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

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

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
            }
        }
    }
}

}

问题是,即使您检查 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