Kotlin中如何将指定类的属性类型设为函数参数类型
实现方法
Kotlin 目前没有你伪代码里写的propertyTypeOfCarId这类直接引用属性类型的内置关键字,但有两种成熟方案可以完全满足「修改Car类id属性类型时,无需同步调整函数定义」的需求:
- 方案1:类内类型别名(生产环境首选,零反射、零额外开销、纯编译期校验)
把id的类型声明收敛到Car类内部做统一管理,属性定义和外部函数都引用这个统一的类型声明,后续改类型只需要动Car类里的一行代码:
data class Car(var id: IdType) { companion object { // 后续要把id改成Int类型,仅修改这一处即可 typealias IdType = String } } // 函数直接引用Car类内统一声明的id类型,不需要硬编码具体类型 fun doWhatever(id: Car.IdType) { // 业务逻辑实现 }
这个写法没有任何额外性能损耗,IDE补全、类型跳转、重构关联都正常支持,是目前行业内的通用实现方式。
- 方案2:reified泛型绑定(无需额外定义类型别名)
如果你不想在Car类里加额外的类型别名,想直接绑定现有id属性的类型,可以用内联reified泛型配合kotlin反射实现类型自动适配:
import kotlin.reflect.jvm.jvmErasure inline fun <reified T> doWhatever(id: T) { // 自动对齐Car.id的类型,修改Car.id类型后这里无需改动 check(T::class == Car::id.returnType.jvmErasure) // 业务逻辑实现 }
注意:这个方案需要引入
kotlin-reflect依赖,类型校验逻辑会在函数调用时执行,传参类型和Car.id不匹配时会直接抛出错误,适合不想修改Car类原有定义的场景。
目前Kotlin官方还在讨论新增成员类型直接引用的语法特性,在正式语法上线前,上述两个方案完全可以覆盖需求,优先选方案1即可。
内容的提问来源于stack exchange,提问作者Leonel Fusco
相关产品推荐
相关产品推荐

