Dlaczego nie można użyć „kotlin.Result” jako typu zwracanego?

85

Stworzyłem metodę i zwraca Result<R> w klasie MyClass<R>, ale komunikat o błędzie to: „kotlin.Result” nie może być używany jako typ zwracany

Zajrzałem również do kodu źródłowego wyników, aby uzyskać kilka wskazówek; dlaczego tak jest?

Kod testowy (przy użyciu wersji 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
źródło
Pokaż nam swój kod, który powoduje błąd. Skąd się kotlin.Resultbierze? Nie mogę znaleźć tej klasy w bibliotece standardowej .
Jesper
Wypróbuj Kotlin 1.3 lub nowszy
ersin-ertan

Odpowiedzi:

61

Z Kotlin KEEP :

Powodem tych ograniczeń jest to, że przyszłe wersje Kotlin mogą rozszerzać i / lub zmieniać semantykę funkcji, które zwracają typ wynikowy, a operatory bezpieczeństwa null mogą zmieniać semantykę, gdy są używane na wartościach typu Wynik. Aby uniknąć złamania istniejącego kodu w przyszłych wersjach Kotina i pozostawić otwarte drzwi dla tych zmian, odpowiednie zastosowania powodują teraz błąd. Wyjątki od tej reguły dotyczą dokładnie sprawdzonych deklaracji w bibliotece standardowej, które są częścią samego interfejsu API typu wynikowego.

Uwaga: jeśli chcesz po prostu eksperymentować z Resulttypem, możesz ominąć to ograniczenie, podając argument kompilatora Kotlin -Xallow-result-return-type.

Podczas korzystania z Gradle w projekcie Java lub Android: Zdefiniuj argument kompilatora w zadaniu kompilacji Kotlin. Dotyczy to zarówno kodu produkcyjnego, jak i testów.

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

W przypadku korzystania z Gradle w projekcie wieloplatformowym: Zdefiniuj argument kompilatora dla każdej kompilacji docelowej. Dotyczy to zarówno kodu produkcyjnego, jak i testów.

kotlin {
    targets.all {
        compilations.all {
            kotlinOptions {
                freeCompilerArgs = freeCompilerArgs + "-Xallow-result-return-type"
            }
        }
    }
}
Alexey Belkov
źródło
2
czy możesz dodać fragment o tym, jak można to zrobić w gradle?
saiedmomen
przez odcinek „” od przyszłych osiągnięć, które utrzymują wyjaśnia niektóre z potencjalnych zmian rozbijających że motywowane te ograniczenia
gMale
Alternatywnie możesz użyć innej implementacji typu Result dostarczonej przez github.com/michaelbull/kotlin-result lub github.com/kittinunf/Result
lecker909
34
android {
    kotlinOptions {
        freeCompilerArgs = ["-Xallow-result-return-type"]
    }
}

Jeśli używasz Androida to rozwiązanie dla gradle

Ильсур Ибрагимов
źródło
Kotlin DSL:freeCompilerArgs = listOf("-Xallow-result-return-type")
Micha
8

Jeśli używasz 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>

Jeśli używasz gradle:

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


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

Źródło: http://rustyrazorblade.com/post/2018/2018-12-06-kotlin-result/

Calin
źródło