¿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)   
}

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

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


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/

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.