如何在Kotlin中定义通用结果或错误类型?类似于来自TypeScript的此示例
type Errorneous<E, R> =
{ is_error: true, error: E } | { is_error: false, result: R }
function calculate(): Errorneous<String, Number> {
return { is_error: false, result: 2 }
}
问题在于Kotlin没有通用的密封类。
可以定义类似的内容
data class Errorneous<E, R>(val error: E?, val result: R?)
但是它不是理想的,因为它允许类似错误的用法
Errorneous<String, Int>(null, null)
Errorneous<String, Int>("", 2)
更新
可能(不编译)的Kotlin代码
sealed class Errorneous
class Success<R>(val result: R) : Errorneous()
class Fail<R>(val error: R) : Errorneous()
fun calculate(): Errorneous {
return Success(2)
}
fun main() {
val result = calculate()
if (result is Success<*>) {
val r: Int = result.result // <= Problem here, no smart cast
}
}
答案 0 :(得分:1)
您还必须向基类中添加通用参数:
sealed class Errorneous<E,R>
class Error<E,R>(val error: E): Errorneous<E,R>()
class Success<E,R>(val result: R): Errorneous<E,R>()
fun calculate(): Errorneous<String, Int> {
return Success(2)
}
fun main() {
val result = calculate()
if (result is Success<*, Int>) {
val r: Int = result.result // <= smart cast
}
}