我想在Kotlin中模拟两个六面骰子的结果。在TypeScript中,你可以这样做:
type SixSidedDie = 1 | 2 | 3 | 4 | 5 | 6
我想在Kotlin做一些类似的事情
typealias SixSidedDie = 1 | 2 | 3 | 4 | 5 | 6
当然,这是行不通的,因为编译器需要一个类型。在Kotlin中有什么方法可以将常量值用作类型吗?
j9per5c41#
在Kotlin中有什么方法可以将常量值用作类型吗?目前还没有,到目前为止我还没有看到讨论过它,这是因为,没有联合类型,我不认为它们真的有用(你可以使用object来达到这个目的)。跟踪可能向语言添加的可表示联合类型时存在问题:https://youtrack.jetbrains.com/issue/KT-13108/Denotable-union-and-intersection-types现在关于你的具体用例,Kotlin中目前还没有任何东西可以将数字子集表示为类型,正如评论中提到的,你能得到的最接近的是一个枚举:
object
enum class Dice6Result { ONE, TWO, THREE, FOUR, FIVE, SIX }
或者,如果需要,使用关联的Int值:
Int
enum class Dice6Result(val value: Int) { ONE(1), TWO(2), THREE(3), FOUR(4), FIVE(5), SIX(6) }
注意,联合类型仍然不能解决Int子集问题,除非常量值可以用作类型(如您所要求的)。另一个选择是使用value class来 Package 整数值,并在构造时检查init块中的值是否在边界内,但是这变成了运行时检查,可能没有枚举有趣。
value class
init
1条答案
按热度按时间j9per5c41#
在Kotlin中有什么方法可以将常量值用作类型吗?
目前还没有,到目前为止我还没有看到讨论过它,这是因为,没有联合类型,我不认为它们真的有用(你可以使用
object
来达到这个目的)。跟踪可能向语言添加的可表示联合类型时存在问题:https://youtrack.jetbrains.com/issue/KT-13108/Denotable-union-and-intersection-types
现在关于你的具体用例,Kotlin中目前还没有任何东西可以将数字子集表示为类型,正如评论中提到的,你能得到的最接近的是一个枚举:
或者,如果需要,使用关联的
Int
值:注意,联合类型仍然不能解决
Int
子集问题,除非常量值可以用作类型(如您所要求的)。另一个选择是使用
value class
来 Package 整数值,并在构造时检查init
块中的值是否在边界内,但是这变成了运行时检查,可能没有枚举有趣。