web-dev-qa-db-fra.com

Pourquoi "kotlin.Result" ne peut-il pas être utilisé 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 'kotlin.Result' ne peut pas être utilisé comme type de retour

J'ai également examiné le code source de Result pour quelques astuces. Pourquoi cela est-il ainsi?

Code de test (avec 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)   
}
37
ersin-ertan

De la Kotlin KEEP :

Ces limitations s’expliquent par le fait que les futures versions de Kotlin pourraient étendre et/ou changer la sémantique des fonctions qui renvoient le type de résultat et que les opérateurs null-safety peuvent changer de sémantique lorsqu’elles sont utilisées avec des valeurs de type de résultat. Afin d'éviter de casser le code existant dans les futures versions de Kotin et de laisser la porte ouverte à ces modifications, les utilisations correspondantes génèrent une erreur maintenant. Des exceptions à cette règle sont faites pour les déclarations soigneusement examinées dans la bibliothèque standard faisant partie de l'API de type de résultat elle-même.

Remarque: si vous souhaitez simplement expérimenter avec le type Result, vous pouvez contourner cette limitation en fournissant un argument du compilateur Kotlin -Xallow-result-return-type.

31
Alexey Belkov
Android {
    kotlinOptions {
        freeCompilerArgs = ["-Xallow-result-return-type"]
    }
}

Si vous utilisez Android cette solution pour modifier

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

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

2
Calin