我想使用 Generic 求和 2 Int 或 2 Double。
fun <T> someFunction(a: T,b: T) {
Log.d(TAG, "${a b}")
}
uj5u.com熱心網友回復:
inline fun <reified T : Number> someFunction(a: T, b: T): T? {
return when {
a is Int && b is Int -> (a.toInt() b.toInt()) as T
a is Double && b is Double -> (a.toDouble() b.toDouble()) as T
else -> null
}
}
val resultInt = someFunction(2, 3) // value: 5 , type: Int?
val resultDouble = someFunction(2.25, 3.5) // value: 5.75, type: Double?
val resultMixed = someFunction(2, 3.5) // value: null, type: Number?
uj5u.com熱心網友回復:
我認為這可能對你有用
fun <T: Number> someFunction(a: T,b: T) {
val result = (a.toDouble() b.toDouble()) as T
Log.d(TAG, "$result")
}
或者如果你想退貨
fun <T: Number> someFunction(a: T,b: T): T {
return (a.toDouble() b.toDouble()) as T
}
uj5u.com熱心網友回復:
不幸的是,沒有好的方法可以做到這一點。
雖然Number是數值型別的超類,但它沒有被指定——它允許您將值轉換為標準數值型別之一。它不提供任何方法來進行算術或其他數字運算。
(這可能是因為型別不起作用。在具有許多數字型別的傳統語言中,例如 C 和 Java,操作的結果具有取決于運算元型別的型別:添加 ashort和 anint給出int結果。但是對于類方法,沒有辦法表達這一點。)
因此,如果您想處理 any Number,可能有兩種方法可以采取。
由于唯一Number提供的是將其轉換為特定的數字型別,因此一種方法是轉換為“最佳”型別,并在該型別中進行算術運算。例如,如果您只關心整數值,那么您可以toLong()使用Longs呼叫并執行所有算術運算。
例如:
fun <T> someFunction(a: T,b: T) {
Log.d(TAG, "${a.toLong() b.toLong()}")
}
但這不是一個好的通用解決方案,因為通常沒有“最佳”型別 - 無論您選擇哪種型別,都有一些值無法存盤。(Long是最大的整數型別,但不能存盤分數和,Double是中國最大的浮點型別,但不能存盤的全精度的Longs-例如,兩者Long.MAX_VALUE并Long.MAX-VALUE - 1轉換為相同的Double值。)所以,無論您選擇的型別會冒某種形式的不精確或四舍五入的風險。
另一種方法是查看您擁有哪些具體型別,并分別處理每種組合。?例如:
例如:
fun <T> someFunction(a: T,b: T) {
if ((a is Long && (b is Long || b is Int || b is Char || b is Short || b is Byte))
|| (b is Long && (a is Long || a is Int || a is Char || a is Short || a is Byte)))
Log.d(TAG, "${a.toLong() b.toLong()}")
else if ((a is Int && (b is Int || b is Char || b is Short || b is Byte))
|| (b is Int && (a is Int || a is Char || a is Short || a is Byte)))
Log.d(TAG, "${a.toInt() b.toInt()}")
else if ((a is Short && (b is Short || b is Byte))
|| (b is Short && (a is Short || a is Byte)))
Log.d(TAG, "${a.toShort() b.toShort()}")
// …and so on, for all the other combinations you want to handle…
}
這為您提供了更好的控制;但它很少使用,因為它在大多數情況下過于冗長且笨拙。(而且它不會處理Number人們撰寫的任何新子類。)
因此,沒有很好的通用方法以通用方式處理數字。
相反,人們傾向于采用兩種特定的方法:
選擇一種具體型別,然后使用它。?通常,您的代碼的要求決定了一個合適的型別(例如
Int),雖然泛型很好,但通常不是嚴格需要的。提供一個
Long版本和一個Double版本。?在它們之間,這些型別可以保存來自所有內置數字型別的所有可能值,因此對于任何特定用途,一個或另一個通常就足夠了。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/405558.html
標籤:
上一篇:如何使泛型和默認值協同作業
