Почему нельзя использовать kotlin.Result в качестве возвращаемого типа?
Я создал метод, и возвращаемое значение равно 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)
}
Ответы
Ответ 1
От Kotlin KEEP:
Обоснование этих ограничений заключается в том, что будущие версии Kotlin могут расширять и/или изменять семантику функций, которые возвращают тип результата и операторы с нулевой безопасностью, могут изменять свою семантику при использовании по значениям типа результата. Чтобы не нарушать существующий код в будущих выпусках Kotin и оставить дверь открытой для этих изменений, соответствующие применения приводят к ошибке. Исключения из этого правила сделаны для тщательно просмотренных деклараций в стандартной библиотеке, которые являются частью самого API типа результата.
Примечание. Если вы просто хотите поэкспериментировать с типом Result
вы можете обойти это ограничение, предоставив аргумент компилятора Kotlin -Xallow-result-return-type
.
Ответ 2
android {
kotlinOptions {
freeCompilerArgs = ["-Xallow-result-return-type"]
}
}
Если вы используете Android это решение для Gradle
Ответ 3
При использовании 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/