我如何传递具有通用类型 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.players
和 chunk.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
我想弄清楚如何将具有泛型类型的接收器传递给另一个函数,以尝试在另一个函数中实现必要的功能。但是,我不断收到类型不匹配错误。
我尝试过的: 尝试将第二个函数的泛型转换为相应的类型,并尝试具体化相应的泛型 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.players
和 chunk.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