我正在嘗試這樣做
infix fun Int.divBy (_denom: Int): Rational {
var num = this.toBigInteger()
var denom = _denom.toBigInteger()
// reduce result
val result = Rational(num, denom)
result.reduce()
// return
println("Returning: Rational $result")
return result
}
但是對于 Long、Int 和 BigInteger,并且不必為它們全部重寫相同的內容。我試過這個,但我收到一個錯誤:
infix fun <T> T.divBy (_denom: T): Rational where
T: Int, T:BigInteger, T: Long
{
....
}
這樣val third = 1 divBy 3可以做類似的事情。
錯誤 1
uj5u.com熱心網友回復:
我相信這是不可能的,因為沒有“可轉換為 BigInteger 的東西”的介面。盡管如此,您仍然可以將大部分代碼保存在單個函式接收BigInteger物件中,并提供多個函式以僅轉換為BigInteger:
infix fun Int.divBy(denom: Int): Rational = toBigInteger() divBy denom.toBigInteger()
infix fun Long.divBy(denom: Long): Rational = toBigInteger() divBy denom.toBigInteger()
inline infix fun BigInteger.divBy (denom: BigInteger): Rational {
// reduce result
val result = Rational(this, denom)
result.reduce()
// return
println("Returning: Rational $result")
return result
}
編輯(@ademord):最終解決方案如下所示,清理后:
infix fun Int.divBy(denom: Int): Rational = toBigInteger() divBy denom.toBigInteger()
infix fun Long.divBy(denom: Long): Rational = toBigInteger() divBy denom.toBigInteger()
infix fun BigInteger.divBy (denom: BigInteger): Rational = Rational(this, denom).reduce()
作為旁注,它不能用泛型和上限來完成,因為它們的主要目的是函式內部的代碼知道T. where子句用于指定T需要共同滿足的多個要求。上限是 AND 運算的,而不是 OR 運算的。請注意,如果它們將被 ORed,那么我們仍然需要添加運行時型別檢查和強制轉換,這正是我們試圖避免提供上限的內容(感謝 @Tenfour04 指出這一點)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/312840.html
標籤:科特林
上一篇:我可以使用直接檔案路徑來訪問存盤在應用程式特定存盤中的檔案嗎?
下一篇:在Kotlin資料類中更新資料
