Kotlin:使用特定值作为类型

envsm3lx  于 2023-01-17  发布在  Kotlin
关注(0)|答案(1)|浏览(105)

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

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

我想在Kotlin做一些类似的事情

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

当然,这是行不通的,因为编译器需要一个类型。在Kotlin中有什么方法可以将常量值用作类型吗?

j9per5c4

j9per5c41#

在Kotlin中有什么方法可以将常量值用作类型吗?
目前还没有,到目前为止我还没有看到讨论过它,这是因为,没有联合类型,我不认为它们真的有用(你可以使用object来达到这个目的)。
跟踪可能向语言添加的可表示联合类型时存在问题:https://youtrack.jetbrains.com/issue/KT-13108/Denotable-union-and-intersection-types
现在关于你的具体用例,Kotlin中目前还没有任何东西可以将数字子集表示为类型,正如评论中提到的,你能得到的最接近的是一个枚举:

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来 Package 整数值,并在构造时检查init块中的值是否在边界内,但是这变成了运行时检查,可能没有枚举有趣。

相关问题