You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Kotlin中创建支持数值相乘与字符串拼接的泛型函数

问题分析与修改方案

你的代码无法编译主要有两个核心问题:

  • 函数未声明返回类型,默认返回Unit,但代码中返回了数字或字符串,类型不匹配
  • 逻辑顺序不符合需求:你需要任一输入为String就执行拼接,但原代码的else分支才处理拼接,会把非数字的其他类型(比如Boolean)也纳入拼接逻辑,同时无约束的泛型设计也没必要。

修改后的代码

fun combineOrMultiply(x: Any, y: Any): Any {
    return when {
        // 优先处理任一输入为String的拼接场景
        x is String || y is String -> x.toString() + y.toString()
        // 处理数字类型的相乘场景
        x is Int && y is Int -> x * y
        x is Double && y is Double -> x * y
        x is Float && y is Float -> x * y
        // 处理不支持的类型,抛出明确异常
        else -> throw IllegalArgumentException("不支持的输入类型:${x.javaClass.simpleName} 和 ${y.javaClass.simpleName}")
    }
}

关键修改点说明

  1. 显式声明返回类型Any:因为函数可能返回数字(Int/Double/Float)或字符串,Any是它们的共同父类,解决了返回类型不匹配的编译错误。
  2. 调整逻辑顺序:先判断是否有任一输入为String,严格符合你“任一输入为String则执行拼接”的需求,避免误处理其他非数字类型。
  3. 简化参数类型:原泛型T没有任何约束,直接用Any作为参数类型更直观,也能满足所有输入场景。
  4. 增加异常处理:对不支持的输入类型抛出明确异常,避免静默处理导致的潜在问题(你也可以根据需求替换为默认返回值,比如""或0)。

如果一定要保留泛型写法,也可以这样修改(泛型在这里仅作为统一参数类型的标识,实际作用和Any一致):

fun <T> combineOrMultiply(x: T, y: T): Any {
    return when {
        x is String || y is String -> x.toString() + y.toString()
        x is Int && y is Int -> x * y
        x is Double && y is Double -> x * y
        x is Float && y is Float -> x * y
        else -> throw IllegalArgumentException("不支持的输入类型:${x.javaClass.simpleName} 和 ${y.javaClass.simpleName}")
    }
}

内容的提问来源于stack exchange,提问作者Veki

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 20:17:14