Чому "kotlin.Result" не можна використовувати як тип повернення?


84

Я створив метод, і повернення знаходиться Result<R>в класі MyClass<R>, але повідомлення про помилку: 'kotlin.Result' не може використовуватися як тип повернення

Я також розглянув вихідний код Результату, щоб отримати кілька підказок; чому це так?

Тестовий код (з використанням версії 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? Я не можу знайти цей клас у стандартній бібліотеці .
Jesper

Спробуйте kotlin 1.3 або новішу
ersin-ertan

Відповіді:


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 у проекті Multiplatform: Визначте аргумент компілятора для кожної цільової компіляції. Це стосується як виробничого коду, так і тестів.

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

2
Ви можете додати фрагмент про те, як це можна зробити у gradle?
saiedmomen

розділ `` майбутні досягнення '' цього KEEP пояснює деякі потенційні зміни, що
зумовили

Крім того, ви можете використовувати іншу реалізацію типу Result, надану github.com/michaelbull/kotlin-result або github.com/kittinunf/Result
lecker909


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/

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.