如何将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
相关产品推荐
相关产品推荐

