如何启用Kotlin的「任意表达式单元转换」实验特性?
Kotlin实验性特性「unit conversions on arbitrary expressions」启用方法
问题场景
报错提示:
特性「unit conversions on arbitrary expressions」为实验性特性,需显式启用。您也可将该表达式的原始类型改为(...) -> Unit
对应代码:
val foo: () -> String = { "Test" } fun bar(doSometing: () -> Unit) { /* */ } val baz = bar(foo) // 此处触发报错
问题根源:bar期望接收() -> Unit类型参数,但传入的foo是() -> String类型,若想让编译器自动将返回值类型转换为Unit,需显式启用上述实验性特性。
启用方法
该特性需通过编译参数-Xallow-result-return-unit开启,不同项目类型配置方式如下:
1. Gradle项目
Kotlin DSL(build.gradle.kts)
tasks.withType<KotlinCompile> { kotlinOptions { freeCompilerArgs += "-Xallow-result-return-unit" } }
Groovy DSL(build.gradle)
tasks.withType(KotlinCompile) { kotlinOptions { freeCompilerArgs += '-Xallow-result-return-unit' } }
2. Maven项目
在kotlin-maven-plugin的配置中添加编译参数:
<plugin> <groupId>org.jetbrains.kotlin</groupId> <artifactId>kotlin-maven-plugin</artifactId> <version>${kotlin.version}</version> <executions> <execution> <id>compile</id> <goals><goal>compile</goal></goals> <configuration> <args> <arg>-Xallow-result-return-unit</arg> </args> </configuration> </execution> </executions> </plugin>
3. IntelliJ IDEA单独运行配置
在运行/调试配置的「Kotlin compiler options」中添加:
-Xallow-result-return-unit
替代方案(更稳妥)
由于这是实验性特性,未来可能存在变更风险,建议手动适配类型:
// 方案1:调用时包装成Unit类型的lambda val baz = bar { foo() } // 方案2:直接修改foo的类型(业务允许的情况下) val foo: () -> Unit = { "Test" }
内容的提问来源于stack exchange,提问作者m.reiter
相关产品推荐
相关产品推荐

