¿Por qué no se puede usar 'kotlin.Result' como un tipo de retorno?

84

Creé un método y la devolución está Result<R>en una clase de MyClass<R>, pero el mensaje de error es: 'kotlin.Result' no se puede usar como un tipo de devolución

También busqué algunas sugerencias en el código fuente del resultado; ¿por qué esto es tan?

Código de prueba (usando 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)   
}
ersin-ertan
fuente
Muéstranos tu código que causa el error. De donde kotlin.Resultviene No puedo encontrar esa clase en la biblioteca estándar .
Jesper
Pruebe kotlin 1.3 o más reciente
ersin-ertan

Respuestas:

60

Desde Kotlin KEEP :

El motivo de estas limitaciones es que las versiones futuras de Kotlin pueden expandir y / o cambiar la semántica de las funciones que devuelven el tipo de resultado y los operadores de seguridad nula pueden cambiar su semántica cuando se utilizan en valores de tipo de resultado. Para evitar romper el código existente en futuras versiones de Kotin y dejar la puerta abierta para esos cambios, los usos correspondientes producen un error ahora. Se hacen excepciones a esta regla para las declaraciones cuidadosamente revisadas en la biblioteca estándar que son parte de la API de tipo de resultado.

Nota: si solo desea experimentar con el Resulttipo, puede omitir esta limitación proporcionando un argumento del compilador de Kotlin -Xallow-result-return-type.

Al usar Gradle en un proyecto de Java o Android: Defina el argumento del compilador en la tarea de compilación de Kotlin. Se aplica tanto al código de producción como a las pruebas.

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

Al usar Gradle en un proyecto multiplataforma: Defina el argumento del compilador para cada compilación de destino. Se aplica tanto al código de producción como a las pruebas.

kotlin {
    targets.all {
        compilations.all {
            kotlinOptions {
                freeCompilerArgs = freeCompilerArgs + "-Xallow-result-return-type"
            }
        }
    }
}
Alexey Belkov
fuente
2
¿Puede agregar un fragmento sobre cómo se puede hacer en gradle?
saiedmomen
la sección de 'avances futuros' de ese KEEP explica algunos de los posibles cambios importantes que motivaron estas limitaciones
gMale
Alternativamente, puede usar una implementación diferente del tipo de resultado proporcionado por github.com/michaelbull/kotlin-result o github.com/kittinunf/Result
lecker909
33
android {
    kotlinOptions {
        freeCompilerArgs = ["-Xallow-result-return-type"]
    }
}

Si usa Android esta solución para gradle

Ильсур Ибрагимов
fuente
8

Si usa 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>

Si usa gradle:

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


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

Fuente: http://rustyrazorblade.com/post/2018/2018-12-06-kotlin-result/

Calin
fuente