我正在決議多個 CSV 檔案,并希望為我的應用程式提供一些具有日志記錄功能的通用決議器。是否可以為它提供一些通用的解決方案?
我的嘗試是:
interface Converter<out T> {
fun convert(fieldName: String, value: String): T?
}
object DoubleMapper : Converter<Double> {
private val log = LoggerFactory.getLogger(this::class.java)
override fun convert(fieldName: String, value: String): Double {
log.info("Converting $fieldName: $value to Double")
return 123.3
}
}
object ConverterProvider {
private val log = LoggerFactory.getLogger(ConverterProvider::class.java)
inline fun <reified T : Any> getConverter(): (String, String) -> T {
return when (T::class) {
Double::class -> DoubleMapper::convert
Int::class -> IntMapper::convert
else -> {
throw java.lang.RuntimeException("We do not have mapper")
}
}
}
}
但是,這不會編譯,kotlin 是否提供了這樣的功能,使函式回傳型別取決于型別引數?
uj5u.com熱心網友回復:
您的解決方案幾乎是正確的。唯一的問題是編譯器不夠聰明,無法理解您驗證了型別T并回傳了正確型別的轉換器。您只需要將轉換器轉換為T:
return when (T::class) {
...
} as (String, String) -> T
這個強制轉換是未經檢查的,這意味著編譯器不能在運行時保證強制轉換是安全的。但是,只要您回傳正確的轉換器T,這樣的轉換應該是安全的,您可以取消警告:
@Suppress("UNCHECKED_CAST")
return when (T::class) {
...
} as (String, String) -> T
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/479630.html
上一篇:查找x小時前最近的中午或午夜
下一篇:我訪問相機的kotlin代碼給出了這個錯誤->未解決的參考:PERMISSION_GRANTED。請幫我解決這個錯誤
