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


84

我创建了一个方法,返回值Result<R>在的类中MyClass<R>,但错误消息是:'kotlin.Result'不能用作返回类型

我还研究了Result源代码中的一些提示。为什么会这样呢?

测试代码(使用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)   
}

向我们显示导致错误的代码。哪里kotlin.Result来的?我在标准库中找不到该类。
Jesper

试试kotlin 1.3或更高版本
ersin-ertan '18

Answers:


60

Kotlin KEEP

这些限制的基本原理是,将来的Kotlin版本可能会扩展和/或更改返回Result类型的函数的语义,并且在用于Result类型的值时,空安全运算符可能会更改其语义。为了避免在Kotin的将来发行版中破坏现有代码并为这些更改敞开大门,相应的用法现在会产生错误。对于此规则的例外情况是,标准库中的仔细检查的声明是Result类型API本身的一部分。

注意:如果您只想尝试使用该Result类型,则可以通过提供Kotlin编译器参数来绕过此限制-Xallow-result-return-type

在Java或Android项目上使用Gradle时: 在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"
            }
        }
    }
}

2
您能否添加有关如何在Gradle中完成操作的摘要?
saiedmomen

KEEP“未来发展”部分解释了激发这些局限性的一些潜在突破性变化
gMale



8

如果使用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>

如果使用gradle:

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


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

资料来源:http : //rustyrazorblade.com/post/2018/2018-12-06-kotlin-result/

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.