如何实现支持Int、Long、BigInteger多上界的Kotlin泛型中缀函数divBy
错误原因
你之前使用多上界泛型的写法不符合Kotlin语法规则:where子句并列多个上界约束的语义是泛型参数T必须同时满足所有约束,而Int、Long、BigInteger是相互独立的类型,不存在任何类型可以同时继承这三个类,因此这个约束永远无法满足,编译必然失败。
实现方案
推荐使用「核心逻辑抽取+分类型重载扩展函数」的方案,既没有重复代码,也能在编译期完成类型校验,运行无额外开销:
- 首先抽取公共的有理数构建逻辑为私有工具方法
private fun buildRational(num: BigInteger, denom: BigInteger): Rational { val result = Rational(num, denom) result.reduce() println("Returning: Rational $result") return result }
- 分别为三个目标类型声明中缀扩展函数,直接调用公共逻辑即可
infix fun Int.divBy(denom: Int) = buildRational(this.toBigInteger(), denom.toBigInteger()) infix fun Long.divBy(denom: Long) = buildRational(this.toBigInteger(), denom.toBigInteger()) infix fun BigInteger.divBy(denom: BigInteger) = buildRational(this, denom)
实现后即可正常调用所有目标场景:
- Int 类型调用:
val third = 1 divBy 3 - Long 类型调用:
val half = 2L divBy 4L - BigInteger 类型调用:
val quarter = BigInteger.TEN divBy BigInteger.valueOf(40)
内容的提问来源于stack exchange,提问作者Ademord
相关产品推荐
相关产品推荐

