Kotlin和歧视工会(总数类型)
Kotlin有什么像歧视工会(总和类型)? 什么是这个(F#)的惯用Kotlin翻译:
type OrderMessage = | New of Id: int * Quantity: int | Cancel of Id: int let handleMessage msg = match msg with | New(id, qty) -> handleNew id qty | Cancel(id) -> handleCxl id
以OO语言(如Kotlin或Scala)实现这种抽象的常见方式是通过继承:
open class OrderMessage private () { // private constructor to prevent creating more subclasses outside class New(val id: Int, val quantity: Int) : OrderMessage() class Cancel(val id: Int) : OrderMessage() }
如果你喜欢,你可以把公共部分推到超类中:
open class OrderMessage private (val id: Int) { // private constructor to prevent creating more subclasses outside class New(id: Int, val quantity: Int) : OrderMessage(id) class Cancel(id: Int) : OrderMessage(id) }
类型检查器不知道这样的层次结构是封闭的,所以当你做一个类似case的匹配( when
表达式)时,它会抱怨它不是穷尽的,但是这个很快就会被修复。
更新:虽然Kotlin不支持模式匹配 ,但可以使用-expressions作为智能转换来获得几乎相同的行为:
when (message) { is New -> println("new $id: $quantity") is Cancel -> println("cancel $id") }
在这里看到更多关于聪明的演员。
Kotlin对这个问题的sealed class
方法与Scala sealed class
非常相似。
https://kotlinlang.org/docs/reference/classes.html#sealed-classes
示例(来自该链接):
sealed class Expr { class Const(val number: Double) : Expr() class Sum(val e1: Expr, val e2: Expr) : Expr() object NotANumber : Expr() }