Warum kann 'kotlin.Result' nicht als Rückgabetyp verwendet werden?

80

Ich habe eine Methode erstellt und die Rückgabe erfolgt Result<R>in einer Klasse von MyClass<R>, aber die Fehlermeldung lautet: 'kotlin.Result' kann nicht als Rückgabetyp verwendet werden

Ich habe auch im Quellcode des Ergebnisses nach einigen Hinweisen gesucht. Warum ist das so?

Testcode (unter Verwendung von 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)   
}
ersin-ertan
quelle
Zeigen Sie uns Ihren Code, der den Fehler verursacht. Woher kommt kotlin.Resultdas? Ich kann diese Klasse nicht in der Standardbibliothek finden .
Jesper
Versuchen Sie Kotlin 1.3 oder neuer
ersin-ertan

Antworten:

57

Aus dem Kotlin KEEP :

Der Grund für diese Einschränkungen ist, dass zukünftige Versionen von Kotlin möglicherweise die Semantik von Funktionen erweitern und / oder ändern, die den Ergebnistyp zurückgeben, und Nullsicherheitsoperatoren ihre Semantik ändern können, wenn sie für Werte vom Ergebnistyp verwendet werden. Um zu vermeiden, dass in zukünftigen Versionen von Kotin vorhandener Code beschädigt wird, und die Tür für diese Änderungen offen zu lassen, führen die entsprechenden Verwendungen jetzt zu einem Fehler. Ausnahmen von dieser Regel gelten für sorgfältig überprüfte Deklarationen in der Standardbibliothek, die Teil der Ergebnistyp-API selbst sind.

Hinweis: Wenn Sie nur mit dem ResultTyp experimentieren möchten, können Sie diese Einschränkung umgehen, indem Sie ein Kotlin-Compiler-Argument angeben -Xallow-result-return-type.

Bei Verwendung von Gradle in einem Java- oder Android-Projekt: Definieren Sie das Compiler-Argument für die Kotlin-Kompilierungsaufgabe. Dies gilt sowohl für Produktionscode als auch für Tests.

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

Bei Verwendung von Gradle im Multiplattform-Projekt: Definieren Sie das Compiler-Argument für jede Zielkompilierung. Dies gilt sowohl für Produktionscode als auch für Tests.

kotlin {
    targets.all {
        compilations.all {
            kotlinOptions {
                freeCompilerArgs = freeCompilerArgs + "-Xallow-result-return-type"
            }
        }
    }
}
Alexey Belkov
quelle
2
Kannst du bitte einen Ausschnitt darüber hinzufügen, wie es in Gradle gemacht werden kann?
Saiedmomen
Der Abschnitt "Zukünftige Fortschritte" dieses KEEP erklärt einige der möglichen bahnbrechenden Änderungen, die diese Einschränkungen motiviert haben
gMale
Alternativ können Sie eine andere Implementierung des Ergebnistyps verwenden, der von github.com/michaelbull/kotlin-result oder github.com/kittinunf/Result
lecker909
30
android {
    kotlinOptions {
        freeCompilerArgs = ["-Xallow-result-return-type"]
    }
}

Wenn Sie Android diese Lösung für Gradle verwenden

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

Bei Verwendung von 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>

Bei Verwendung von Gradle:

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


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

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

Calin
quelle