有没有办法使密封类泛型?

时间:2020-08-12 05:41:07

标签: kotlin

如何在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
  }
}

1 个答案:

答案 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
    }
}