Kotlin Arrow Optics出现Unresolved reference: company报错
Kotlin Arrow Optics 编译报错:Unresolved reference: company
问题复现
参照Arrow Optics模块文档编写嵌套数据类的透镜示例代码时,编译阶段抛出Unresolved reference: company错误,代码无法正常构建。
出错代码如下:
package com.app import arrow.optics.Optional import arrow.optics.optics @optics data class Street(val number: Int, val name: String) { companion object } @optics data class Address(val city: String, val street: Street) { companion object } @optics data class Company(val name: String, val address: Address) { companion object } @optics data class Employee(val name: String, val company: Company) { companion object } fun main() { // 包含多层嵌套属性的不可变值 val john = Employee("John Doe", Company("Kategory", Address("Functional city", Street(42, "lambda street")))) // 定义指向值内部指定字段的Optional透镜 val optional: Optional<Employee, String> = Employee.company.address.street.name // 直接修改目标字段,不需要手写嵌套的copy方法 optional.modify(john, String::toUpperCase) }
当前项目配置的Arrow相关依赖如下:
//region Arrow implementation("io.arrow-kt:arrow-core:$arrow_version") implementation("io.arrow-kt:arrow-fx-coroutines:$arrow_version") implementation("io.arrow-kt:arrow-optics:$arrow_version") //endregion
故障原因
@optics注解不会在源码编写阶段直接提供Employee.company这类链式访问的透镜属性,这些属性是编译期通过Kotlin符号处理器(KSP)自动生成的。当前配置仅引入了Optics的核心运行时依赖,没有配置对应的KSP插件和注解处理器,自动生成的代码没有被加入编译路径,编译器找不到对应属性就会抛出未解析引用的错误。
修复步骤
- 先确认项目当前使用的Kotlin版本,选择版本号完全匹配的KSP插件,在项目级构建配置中声明KSP插件依赖
- 在业务模块的
plugins配置块中添加KSP插件引用:id("com.google.devtools.ksp") - 在模块的依赖配置块中添加Arrow Optics的KSP处理器依赖,注意使用
ksp依赖配置而非implementation:ksp("io.arrow-kt:arrow-optics-ksp-plugin:$arrow_version") - 执行Gradle同步,触发全量项目重编译,注解处理器会自动为所有标记
@optics的数据类生成对应的透镜扩展属性,Employee.company.address.street.name这类链式调用即可正常编译通过。
注意:Arrow 1.0及以上版本的Optics模块已经完全废弃旧的KAPT注解处理器,必须使用KSP才能正常工作。
内容的提问来源于stack exchange,提问作者Victor Orlyk
相关产品推荐
相关产品推荐

