Kotlin中depend()方法泛型类型推断失败问题求助
问题解决:Kotlin泛型T无法自动推断的替代方案
你遇到的depend()方法泛型无法自动推断的问题,根源是函数级泛型<T : Setting>没有和当前实例的具体子类类型绑定,编译器没法自动确定T的具体类型。以下是几种无需显式指定泛型参数的解决办法:
方案1:将Setting类改为泛型类,绑定子类类型
修改Setting的类声明,让它持有自身子类的泛型类型,这样depend()可以直接返回该类型,编译器能自动推断:
// 修改Setting为泛型抽象类 abstract class Setting<T : Setting<T>>(var name: String, val description: String) { fun depend(vararg dependencies: Setting<*>, resolver: () -> Boolean): T { // 这里添加你的依赖处理逻辑 return this as T } class Builder( private val m: Module, private val n: String, private val d: String ) { private fun <S : Setting<S>> Module.setup(s: S): S { g?.settings?.add(s) this.addSetting(s) return s } fun color(color: ColorMutable = ColorMutable.WHITE) = m.setup(SettingColor(n, d, color)) } } // 修改SettingColor继承泛型Setting class SettingColor(n: String, d: String, val color: ColorMutable) : Setting<SettingColor>(n, d)
修改后调用代码无需显式指定泛型:
val color = setting("Color").color().depend(mode) { mode.like("Lightmap") }
方案2:使用inline reified泛型函数
将depend()改为inline函数并使用reified泛型,让编译器从调用上下文直接推断出具体类型:
abstract class Setting(var name: String, val description: String) { inline fun <reified T : Setting> depend(vararg dependencies: Setting, resolver: () -> Boolean): T { // 这里添加你的依赖处理逻辑 return this as T } // 原Builder类代码保持不变 class Builder( private val m: Module, private val n: String, private val d: String ) { private fun <S : Setting> Module.setup(s: S): S { g?.settings?.add(s) this.addSetting(s) return s } fun color(color: ColorMutable = ColorMutable.WHITE) = m.setup(SettingColor(n, d, color)) } }
这种方式下,编译器会自动识别color()返回的SettingColor作为T的类型,无需手动指定。
方案3:子类重写depend方法(扩展性较差)
如果你的depend()方法仅针对SettingColor使用,可以在子类中重写该方法,直接返回自身类型:
class SettingColor(n: String, d: String, val color: ColorMutable) : Setting(n, d) { fun depend(vararg dependencies: Setting, resolver: () -> Boolean): SettingColor { // 调用父类逻辑 super.depend(dependencies, resolver) return this } }
但这种方式不适用于多子类场景,扩展性有限,仅推荐单一子类的特殊情况。
内容的提问来源于stack exchange,提问作者OffeeX
相关产品推荐
相关产品推荐

