为什么“ kotlin. Result”不能用作返回类型?

我已经创建了一个方法,返回值是 MyClass<R>类中的 Result<R>,但错误消息是: ‘ kotlin。“结果”不能用作返回类型

我还查看了 Result 源代码以获得一些提示; 为什么会这样呢?

测试代码 (使用 v. 1.3-RC)。

class MyClass<R>(val r: R) {
fun f(): Result<R> { // error here
return Result.success(r)
}
}


fun main(args: Array<String>) {
val s = Result.success(1)
val m = MyClass(s)
}
33488 次浏览

来自 Kotlin KEEP:

这些限制背后的基本原理是 Kotlin 可能会扩展和/或改变返回函数的语义 结果类型和空安全运算符可能在以下情况下更改其语义 用于结果类型的值。为了避免破坏已存在的 代码在未来发布的 Kotin,并为那些打开大门 changes, the corresponding uses produce an error now. Exceptions to 本规则适用于标准中经过仔细审查的声明 库,它们是 Result 类型 API 本身的一部分。

注意: 如果你只是想试验一下 Result类型,你可以通过提供一个 Kotlin 编译器参数 -Xallow-result-return-type来绕过这个限制。

When using Gradle on Java or Android project: 在 Kotlin 编译任务中定义编译器参数。它既适用于生产代码,也适用于测试。

tasks.withType<org.jetbrains.kotlin.gradle.tasks.KotlinCompile> {
kotlinOptions {
freeCompilerArgs = freeCompilerArgs + "-Xallow-result-return-type"
}
}

在多平台上使用 Gradle 时: 为每个目标编译定义编译器参数。它适用于生产代码和测试。

kotlin {
targets.all {
compilations.all {
kotlinOptions {
freeCompilerArgs = freeCompilerArgs + "-Xallow-result-return-type"
}
}
}
}
android {
kotlinOptions {
freeCompilerArgs = ["-Xallow-result-return-type"]
}
}

如果你使用 android 这个解决方案为分级

如果使用 maven:

<plugin>
<artifactId>kotlin-maven-plugin</artifactId>
<configuration>
<jvmTarget>1.8</jvmTarget>
<args>
<arg>-Xallow-result-return-type</arg>
</args>
</configuration>
<groupId>org.jetbrains.kotlin</groupId>
<version>${kotlin.version}</version>

If using gradle:

compileKotlin {
kotlinOptions.jvmTarget = "1.8"
kotlinOptions.freeCompilerArgs = ["-Xallow-result-return-type"]




}
compileTestKotlin {
kotlinOptions.jvmTarget = "1.8"
kotlinOptions.freeCompilerArgs = ["-Xallow-result-return-type"]
}

Source: http://rustyrazorblade.com/post/2018/2018-12-06-kotlin-result/