Kotlin泛型函数编写求助:双参数按类型返回不同结果
正确实现Kotlin泛型
combine函数的方案 你的代码存在两个核心问题:
- 泛型参数
T和U无约束,编译器无法确认x + y操作的合法性(并非所有类型都支持+运算符) - 函数未明确返回类型,不同分支返回的
String与数值类型无法被编译器统一推断
以下是修正后的基础实现:
fun <T, U> combine(x: T, y: U): Any { return when { // 任一参数为String时,执行字符串拼接 x is String || y is String -> "${x.toString()} ${y.toString()}" // 两者均为数值类型时,计算数值和 x is Number && y is Number -> { // 统一转为Double,避免Int与Double混合运算的类型问题 x.toDouble() + y.toDouble() } // 不支持的类型组合直接抛出异常,避免静默错误 else -> throw IllegalArgumentException("不支持当前参数类型组合") } }
代码说明:
- 返回类型:明确指定为
Any,因为返回值可能是String或Number子类(Int/Double等),这是最直接的兼容方式。 - 字符串分支简化:无需分多情况判断,只要任一参数是
String,直接用字符串模板拼接——toString()是所有Kotlin类的通用方法,能处理非字符串参数的转换。 - 数值处理:通过
Number约束覆盖所有数值类型(Int、Double、Float等),统一转成Double相加,避免类型溢出或精度丢失问题。 - 异常处理:对不支持的类型组合(如Boolean、自定义类)抛出明确异常,方便调试和定位问题。
进阶优化(类型安全版)
如果希望调用方无需处理Any类型,可使用密封类封装返回结果,实现类型安全的分支处理:
// 密封类定义返回结果的两种类型 sealed class CombineResult { data class StringResult(val value: String) : CombineResult() data class NumberResult(val value: Double) : CombineResult() } fun <T, U> combine(x: T, y: U): CombineResult { return when { x is String || y is String -> CombineResult.StringResult("${x.toString()} ${y.toString()}") x is Number && y is Number -> CombineResult.NumberResult(x.toDouble() + y.toDouble()) else -> throw IllegalArgumentException("不支持当前参数类型组合") } } // 调用示例 fun main() { val strResult = combine("Hello", 123) val numResult = combine(10, 3.5) // 类型安全的结果处理 when (strResult) { is CombineResult.StringResult -> println("字符串结果:${strResult.value}") is CombineResult.NumberResult -> println("数值结果:${strResult.value}") } }
这种方式避免了调用方直接处理Any类型,提升了代码的健壮性和可读性。
内容的提问来源于stack exchange,提问作者Veki
相关产品推荐
相关产品推荐

