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

FunctionKotlinReturn Type

Function Problem Overview


I've created a method, and the return is Result<R> in a class of MyClass<R>, but the error message is: 'kotlin.Result' cannot be used as a return type

I've also looked into the Result source code for some hints; why is this so?

Test code (using 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)   
}

Function Solutions


Solution 1 - Function

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

Solution 2 - Function

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

If you using android this solution for gradle

Solution 3 - Function

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/

Solution 4 - Function

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionersin-ertanView Question on Stackoverflow
Solution 1 - FunctionAlexey BelkovView Answer on Stackoverflow
Solution 2 - FunctionИльсур ИбрагимовView Answer on Stackoverflow
Solution 3 - FunctionCalinView Answer on Stackoverflow
Solution 4 - Functionuser1185087View Answer on Stackoverflow