Why can't 'kotlin.Result' be used as a return type?
FunctionKotlinReturn TypeFunction 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
Update the kotlin version to 1.5 or above. See:
https://github.com/Kotlin/KEEP/blob/master/proposals/stdlib/result.md#limitations-legacy