117 votes

Pourquoi ne peut-on pas utiliser 'kotlin.Result' comme type de retour ?

J'ai créé une méthode, et le retour est Result<R> dans une classe de MyClass<R> mais le message d'erreur est le suivant : "kotlin.Result" ne peut pas être utilisé comme type de retour.

J'ai également consulté le code source de Result pour obtenir quelques indications ; pourquoi en est-il ainsi ?

Code de test (en utilisant la version 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)   
}

0 votes

Montrez-nous votre code qui provoque l'erreur. Où se trouve kotlin.Result proviennent-ils ? Je ne trouve pas cette classe dans le bibliothèque standard .

0 votes

Essayez kotlin 1.3 ou plus récent.

1 votes

Les limitations du type Kotlin Result sont levées dans la version 1.5, vous pouvez librement utiliser le type comme type de retour.

76voto

Alexey Belkov Points 1749

De la Kotlin KEEP :

Le raisonnement qui sous-tend ces limitations est que les futures versions de Kotlin peuvent étendre et/ou modifier la sémantique des fonctions qui retournent Les opérateurs de type Result et null-safety peuvent changer leur sémantique lorsqu'ils sont utilisés sur des valeurs de type Result. utilisées sur des valeurs de type Result. Afin d'éviter de casser le code existant code existant dans les futures versions de Kotin et de laisser la porte ouverte à ces changements, les utilisations correspondantes produisent maintenant une erreur. Les exceptions à cette règle sont faites pour les déclarations soigneusement revues dans la bibliothèque standard qui font partie de l'API du type Result lui-même.

Note : si vous voulez juste expérimenter avec le Result vous pouvez contourner cette limitation en fournissant un argument de compilation Kotlin -Xallow-result-return-type .

Lorsque vous utilisez Gradle sur un projet Java ou Android : Définir l'argument du compilateur sur la tâche de compilation Kotlin. Cela s'applique aussi bien au code de production qu'aux tests.

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

Lorsque vous utilisez Gradle sur un projet multiplateforme : Définir l'argument du compilateur pour chaque compilation cible. Cela s'applique aussi bien au code de production qu'aux tests.

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

44voto

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

Si vous utilisez Android, cette solution pour gradle

1 votes

Kotlin DSL : freeCompilerArgs = listOf("-Xallow-result-return-type")

9voto

Calin Points 1217

Si vous utilisez 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 vous utilisez 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/

4voto

user1185087 Points 2170

Mettez à jour la version de kotlin à 1.5 ou plus. Voir :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X