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() } 
    Interesting Posts