1. ホーム
  2. function

[解決済み] kotlin.Resultはなぜ戻り値として使えないのですか?

2022-09-05 09:54:23

質問

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

ヒントを得るために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)   
}

どのように解決するのですか?

からの コトリンKEEP :

これらの制限の背後にある根拠は、将来のバージョンの を返す関数のセマンティクスを拡張したり変更したりする可能性があるからです。 また、Null-safety演算子はResult型の値に使用されたときにそのセマンティクスを変更する可能性があります。 の値で使用された場合、セマンティクスが変更される可能性があるからです。既存のコードを壊さないようにするために のコードを壊さないようにするためと、そのような変更のためにドアを開けておくためです。 に対応するために、対応する使用は今エラーを生成します。例外として このルールの例外は、標準ライブラリで慎重に検討された宣言のために作られます。 標準ライブラリにある、結果型API自体の一部である、慎重に検討された宣言については例外となります。

注意してください。 を使って実験したいだけなら Result 型の実験をしたいだけなら、Kotlinコンパイラの引数に -Xallow-result-return-type .

JavaやAndroidのプロジェクトでGradleを使用する場合。 Kotlinのコンパイルタスクでcompilerの引数を定義する。これは本番コードとテストの両方に適用されます。

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

マルチプラットフォームプロジェクトでGradleを使用する場合。 コンパイル対象ごとにコンパイラの引数を定義する。これは本番コードとテストの両方に適用されます。

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