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

如何将Class.Companion作为参数传递?Kotlin函数参数适配问题

解决Kotlin函数适配Class.Companion类型参数的问题

问题根源

你调用InputUtils.input("", String)时,传入的String是String.Companion对象(Kotlin中类的伴生对象),但函数定义要求的是KClass<T>类型(即String::class),因此出现类型不匹配。

解决方案

方案1:添加重载函数适配伴生对象

新增一个接收类伴生对象的重载函数,内部自动将伴生对象转换为对应的KClass,无需修改原有函数逻辑:

import java.util.Scanner

fun <T : Any> input(text: String, type: KClass<T>? = null): T {
    val scanner = Scanner(System.`in`)
    while (true) {
        print(text)
        val rawInput = scanner.nextLine()
        val result = convertToAppropriateType(rawInput)
        // 安全类型转换替代强制as T,避免异常
        type?.let {
            it.safeCast(result)?.let { return it }
        } ?: return result as T
    }
}

// 重载函数:接收T的伴生对象,自动映射到KClass<T>
fun <T : Any> input(text: String, companion: T.Companion): T {
    return input(text, T::class)
}

// 示例类型转换函数(根据你的实际需求实现)
private fun convertToAppropriateType(input: String): Any {
    // 这里示例仅返回字符串,你可以扩展处理数字、布尔等类型
    return input
}

// 现在可正常调用:
// InputUtils.input("", String)

方案2:直接修改原函数参数(可选)

如果你希望合并逻辑,可以修改原函数参数,支持同时接收KClass<T>或T.Companion:

import java.util.Scanner
import kotlin.reflect.KClass

fun <T : Any> input(text: String, typeOrCompanion: Any? = null): T {
    val scanner = Scanner(System.`in`)
    val targetType: KClass<T>? = when (typeOrCompanion) {
        is KClass<*> -> typeOrCompanion as KClass<T>
        is T.Companion -> T::class
        else -> null
    }

    while (true) {
        print(text)
        val rawInput = scanner.nextLine()
        val result = convertToAppropriateType(rawInput)
        targetType?.let {
            it.safeCast(result)?.let { return it }
        } ?: return result as T
    }
}

// 调用方式不变:
// InputUtils.input("", String)
// 也可继续传KClass:
// InputUtils.input("", String::class)

关键优化点

  • 用type.safeCast(result)替代强制类型转换as T,避免类型转换异常,代码更安全。
  • 重载函数的方式保留了原有函数的兼容性,同时支持新的调用方式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 10:22:49