我試圖弄清楚如何將具有 Generic 型別的接收器傳遞給另一個函式,以嘗試在該其他函式中實作必要的功能。但是,我不斷收到型別不匹配錯誤。
我嘗試過的:嘗試將第二個函式的泛型轉換為相應的型別,并嘗試具體化相應的泛型 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
}
}
}
}
}
uj5u.com熱心網友回復:
問題是,即使您檢查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
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/341023.html
標籤:科特林 泛型 kotlin-reified-type-parameters
上一篇:我從.NET5升級到.NET6,現在從LINQ查詢中獲取SqlNullValueException
下一篇:具有通用介面的工廠方法
