再會,
我正在嘗試使此代碼正常作業:
fun <T: Comparable<T>> getExtreme(data: JSONArray, searchKeyword: String, compareValue: T, define: CompareOp): T {
val tmpFun: (T, T) -> Boolean = when (define) {
CompareOp.LESSER -> { a: T, b: T -> a < b }
CompareOp.GREATER -> { a: T, b: T -> a > b }
}
var extremeAmount: T = compareValue
for (hourlyIndex in 0 until data.length()) {
val dataSet: JSONObject = data.getJSONObject(hourlyIndex)
val hourlyUvi: T = dataSet.get(searchKeyword) as T
Log.d("MATH FUNC", "$hourlyUvi")
if (tmpFun(hourlyUvi, extremeAmount)) extremeAmount = hourlyUvi
}
return extremeAmount
}
但由于某種原因,它總是拋出這個例外:

我認為錯誤是什么,每次它讀取一個整數時,它都會自動將其轉換為 Int 而不是保持我指定的 T。如果沒有這一行,這段代碼可以正常作業并且幾乎完美無瑕:
if (tmpFun(hourlyUvi, extremeAmount)) extremeAmount = hourlyUvi
如果這是錯誤,如何我是否強制執行我的 T 而不是它自己的定義,為什么要這樣做,或者錯誤是否存在于其他任何地方?
uj5u.com熱心網友回復:
當 JSON 輸入字串是像整數這樣的數字型別并且您想要不同的數字型別作為輸出(例如雙精度)時,有幾個內置的型別轉換器jsonObj.getDouble(key)可以適當地處理轉換。jsonObj.getInt(key)
但是,將其與通用輸出型別 T 一起使用并不那么簡單。如果你真的需要使用泛型,你可以寫一個泛型的 JSONObject to T 轉換器。如果 JSBONObject 不是數字型別或可以決議為數字型別的字串,則getX方法將拋出。
確保轉換器涵蓋了您要使用的所有可能的數字型別,否則它將落入最后一種情況并回傳測驗值。你必須傳入一個 T 型別的物件來進行型別檢查,即使它沒有被使用。
fun <T> jsonObjToType(o: JSONObject, arg: String, test: T): T {
return when(test) {
is Double -> o.getDouble(arg) as T
is Int -> o.getInt(arg) as T
is Float -> o.getDouble(arg).toFloat() as T
is Long -> o.getLong(arg) as T
else -> test // will never hit this as long
// as all possible T types are covered above
}
}
并在你的函式中使用它
val hourlyUvi: T = jsonObjToNumericType(dataSet, searchKeyword, extremeAmount)
if (tmpFun(hourlyUvi, extremeAmount)) extremeAmount = hourlyUvi
注意:當您使用 Int 或 Long 型別時,如果陣列中有浮點值,它們將被截斷為整數值。在幾乎所有情況下,最好只為雙精度撰寫此函式,而不是作為T適當處理所有情況的泛型。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/484570.html
下一篇:ThreadLocal 詳解
