如何为Kotlin高阶函数声明正确的泛型?
泛型重构方案
你完全可以用Kotlin的泛型来统一这两个重复函数,核心是用泛型参数替代具体的Script和FreeScript类型,让函数逻辑复用。
首先是重构后的通用函数:
// 声明泛型参数<T>,代表要处理的目标类型 fun <T> toItems(parseItem: (ElementsContainer) -> T): List<T> { val result = mutableListOf<T>() while (findNextTag("tr") != null) { result.add(parseItem(elementsContainer)) } return result }
关键说明:
<T>:在函数名前声明泛型参数,用来指代任意类型(这里就是Script或FreeScript)parseItem: (ElementsContainer) -> T:修正了原函数的参数问题——原代码里parseScript声明是无参,但调用时传了elementsContainer,所以这里明确让解析函数接收ElementsContainer并返回泛型类型T- 返回值
List<T>:最终生成的列表类型会和解析函数的返回类型自动匹配
调用方式
替换原来的两个函数,直接调用这个通用函数即可:
// 生成Script列表,直接传解析函数引用 val scripts: List<Script> = toItems(::parseScript) // 生成FreeScript列表 val freeScripts: List<FreeScript> = toItems(::parseFreeScript)
如果你的解析逻辑是匿名函数,也可以这么写:
val scripts = toItems { container -> // 这里写原来parseScript的逻辑,返回Script实例 Script(...) }
这样就彻底消除了代码重复,同时保留了类型安全。
内容的提问来源于stack exchange,提问作者BobDoolittle
相关产品推荐
相关产品推荐

