Kotlin:使用特定的值作为类型

  • 本文关键字:类型 Kotlin kotlin
  • 更新时间 :
  • 英文 :


我想在Kotlin中模拟两个六面骰子的结果。在TypeScript中,你可以这样做:

type SixSidedDie = 1 | 2 | 3 | 4 | 5 | 6

我想在Kotlin中使用

做类似的事情
typealias SixSidedDie =  1 | 2 | 3 | 4 | 5 | 6

当然不行,因为编译器需要一个类型。在Kotlin中有任何方法可以使用常量值作为类型吗?

是否有任何方法在Kotlin中使用常量值作为类型?

目前还没有,到目前为止我还没有看到有人讨论这个问题。这是因为,如果没有联合类型,我不认为它们真的有用(您可以使用objects来实现此目的)。

在跟踪可能向语言中添加可表示的联合类型时存在一个问题:https://youtrack.jetbrains.com/issue/KT-13108/Denotable-union-and-intersection-types

现在关于您的精确用例,Kotlin目前也没有可用的东西来将数字的子集表示为类型。正如注释中提到的,最接近的是enum:

enum class Dice6Result {
ONE, TWO, THREE, FOUR, FIVE, SIX
}

或者在需要时使用相关的Int值:

enum class Dice6Result(val value: Int) {
ONE(1), TWO(2), THREE(3), FOUR(4), FIVE(5), SIX(6)
}

注意,联合类型仍然不能解决Int子集问题,除非常量值可以用作类型(如您所要求的)。

另一种选择是使用value class来包装整数值,并在构造时检查init块中的值是否在边界内。然而,这变成了一个运行时检查,这可能没有enum有趣。

最新更新