我想在Kotlin中模拟两个六面骰子的结果。在TypeScript中,你可以这样做:
type SixSidedDie = 1 | 2 | 3 | 4 | 5 | 6
我想在Kotlin中使用
做类似的事情typealias SixSidedDie = 1 | 2 | 3 | 4 | 5 | 6
当然不行,因为编译器需要一个类型。在Kotlin中有任何方法可以使用常量值作为类型吗?
是否有任何方法在Kotlin中使用常量值作为类型?
目前还没有,到目前为止我还没有看到有人讨论这个问题。这是因为,如果没有联合类型,我不认为它们真的有用(您可以使用object
s来实现此目的)。
在跟踪可能向语言中添加可表示的联合类型时存在一个问题: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有趣。