ChatGPT解决这个技术问题 Extra ChatGPT

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

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

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

Test code(使用 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)   
}
向我们展示导致错误的代码。 kotlin.Result 来自哪里?我在 standard library 中找不到该课程。
尝试 kotlin 1.3 或更新版本
Kotlin Result 类型的限制在 1.5 版本中解除,您可以自由地使用该类型作为返回类型。

x
xsveda

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"
            }
        }
    }
}

你能添加一个关于如何在 gradle 中完成的片段吗?
'future advancements' section of that KEEP 解释了导致这些限制的一些潜在重大变化
或者,您可以使用 github.com/michaelbull/kotlin-resultgithub.com/kittinunf/Result 提供的 Result 类型的不同实现
请帮助一个假人理解 !@#$ 这个基本原理的含义。在未来的版本中,任何事情都可能发生变化。为什么结果特别?
И
Ильсур Ибрагимов
android {
    kotlinOptions {
        freeCompilerArgs = ["-Xallow-result-return-type"]
    }
}

如果您使用 android 这个解决方案进行 gradle


Kotlin DSL:freeCompilerArgs = listOf("-Xallow-result-return-type")
C
Calin

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


u
user1185087

将 kotlin 版本更新到 1.5 或更高版本。看:

https://i.stack.imgur.com/QWwUQ.png