Почему нельзя использовать kotlin.Result как возвращаемый тип?

84

Я создал метод, и возвращаемый результат находится 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)   
}
Эрсин-Эртан
источник
Покажите нам свой код, вызывающий ошибку. Откуда kotlin.Resultвзялось? Я не могу найти этот класс в стандартной библиотеке .
Джеспер
Попробуйте kotlin 1.3 или новее
ersin-ertan 03

Ответы:

60

От Kotlin KEEP :

Обоснование этих ограничений заключается в том, что будущие версии Kotlin могут расширять и / или изменять семантику функций, которые возвращают тип результата, а операторы безопасности с нулевым значением могут изменять свою семантику при использовании со значениями типа результата. Чтобы избежать нарушения существующего кода в будущих выпусках Kotin и оставить дверь открытой для этих изменений, соответствующие варианты использования теперь вызывают ошибку. Исключения из этого правила делаются для тщательно проверенных объявлений в стандартной библиотеке, которые являются частью самого API типа результата.

Примечание: если вы просто хотите поэкспериментировать с Resultтипом, вы можете обойти это ограничение, указав аргумент компилятора Kotlin -Xallow-result-return-type.

При использовании Gradle в проекте Java или Android: определите аргумент компилятора в задаче компиляции Kotlin. Это применимо как для производственного кода, так и для тестов.

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"
            }
        }
    }
}
Алексей Белков
источник
2
не могли бы вы добавить отрывок о том, как это можно сделать в Gradle?
saiedmomen 07
раздел «Достижения будущего» этого ДЕРЖИТЕ объясняет некоторые из возможных изменений разбивания , что мотивировали эти ограничения
gMale
В качестве альтернативы вы можете использовать другую реализацию типа Result, предоставленную github.com/michaelbull/kotlin-result или github.com/kittinunf/Result
lecker909
34
android {
    kotlinOptions {
        freeCompilerArgs = ["-Xallow-result-return-type"]
    }
}

Если вы используете Android, это решение для gradle

Ильсур Ибрагимов
источник
8

Если вы используете 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/

Калин
источник