Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why can't 'kotlin.Result' be used as a return type?

People also ask

What is Kotlin result?

Result is a Serializable class in Kotlin. The function definition looks like this − class Result<out T> : Serializable. This class has two properties − "isFailure" and "isSuccess". As per the documentation, Result<T> cannot be used as a direct return type of Kotlin function.

How do you use either in Kotlin?

The answer is using Either. Either is part of the Arrow library, a library that provides some nice “enhancements” to Kotlin to be used in our projects. Either is basically a wrapper object to hold a result of a computation which allows stopping computation as soon as the first error appears.


From the Kotlin KEEP:

The rationale behind these limitations is that future versions of Kotlin may expand and/or change semantics of functions that return Result type and null-safety operators may change their semantics when used on values of Result type. In order to avoid breaking existing code in the future releases of Kotin and leave door open for those changes, the corresponding uses produce an error now. Exceptions to this rule are made for carefully-reviewed declarations in the standard library that are part of the Result type API itself.

Note: if you just want to experiment with the Result type you can bypass this limitation by supplying a Kotlin compiler argument -Xallow-result-return-type.

When using Gradle on Java or Android project: Define the compiler argument on Kotlin compilation task. It applies both for production code and tests.

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

When using Gradle on Multiplatform project: Define the compiler argument for each target compilation. It applies both for production code and tests.

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

android {
    kotlinOptions {
        freeCompilerArgs = ["-Xallow-result-return-type"]
    }
}

If you using android this solution for gradle


If using 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/


Update the kotlin version to 1.5 or above. See:

Screenshot of proposal https://github.com/Kotlin/KEEP/blob/master/proposals/stdlib/result.md#limitations-legacy