web-dev-qa-db-ja.com

なぜ 'kotlin.Result'を戻り値の型として使用できないのですか?

メソッドを作成し、戻り値はResult<R>のクラスのMyClass<R>ですが、エラーメッセージは 'kotlin.Result'であり、戻り値の型として使用できません

また、いくつかのヒントを得るために結果ソースコードを調べました。なぜそうなのですか?

テストコード (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

Kotlin KEEP から:

これらの制限の背後にある理論的根拠は、Kotlinの将来のバージョンが結果タイプを返す関数のセマンティクスを拡張および/または変更する可能性があり、ヌル安全演算子が結果タイプの値で使用されるとセマンティクスを変更する可能性があるということです。 Kotinの将来のリリースで既存のコードが破損することを回避し、それらの変更のためにドアを開いたままにするために、対応する使用は現在エラーを生成します。このルールの例外は、ResultタイプAPI自体の一部である標準ライブラリで慎重にレビューされた宣言に対して行われます。

注:Resultタイプを試してみたい場合は、Kotlinコンパイラー引数-Xallow-result-return-typeを指定することでこの制限を回避できます。

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

Android gradleにこのソリューションを使用している場合

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>

Gradleを使用している場合:

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


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

ソース: http://rustyrazorblade.com/post/2018/2018-12-06-kotlin-result/

2
Calin