如何在Kotlin中从泛型枚举参数推断值类型并合并重载函数?
Kotlin 合并泛型重载方法实现自动类型推断
这在Kotlin里用泛型函数就能轻松实现,核心是让函数的泛型参数同时关联MyEnum的类型参数和value的类型,这样编译器就能自动完成类型推断啦。
首先先修正一下你的枚举类定义(Kotlin里枚举类的泛型写法需要明确每个枚举常量的类型参数和属性值):
enum class MyEnum<T>( val initialValue: T, val minValue: T, val maxValue: T ) { // 定义具体的枚举常量,指定对应的泛型类型 FLOAT(0.0f, 0.0f, 100.0f), INT(0, 0, 100) }
接下来就是合并后的泛型函数实现,通过声明一个泛型参数<T>,让MyEnum<T>和value: T的类型绑定:
protected fun <T> setEngineValue(myEnum: MyEnum<T>, value: T): Boolean { // 这里写你的业务逻辑,比如校验value是否在合法范围内 return when (myEnum) { MyEnum.FLOAT -> { // 如果需要针对Float做特殊处理,可以安全转换(编译器已推断T为Float) val floatValue = value as Float floatValue in myEnum.minValue..myEnum.maxValue } MyEnum.INT -> { val intValue = value as Int intValue in myEnum.minValue..myEnum.maxValue } } }
调用方式
调用时编译器会自动根据传入的MyEnum实例推断T的类型,完全不需要手动指定:
// 自动推断T为Float setEngineValue(MyEnum.FLOAT, 50.0f) // 自动推断T为Int setEngineValue(MyEnum.INT, 50)
为什么不能用MyEnum<*>?
你提到的MyEnum<*>是Kotlin的通配符类型,它表示“任意类型的MyEnum”,但编译器无法确定具体的类型,也就无法关联value的类型,会导致类型不安全。而泛型函数的<T>可以让两个参数的类型形成强绑定,既保证了类型安全,又实现了自动推断。
内容的提问来源于stack exchange,提问作者distante
相关产品推荐
相关产品推荐

