结合scala中的类型

Jas*_*Jas 1 f# scala

我在F#中看到它很容易定义一个类型,它是由一组其他类型组合而来的

type MyFiveNumbers = One | Two | Three | Four | Five
Run Code Online (Sandbox Code Playgroud)

这看起来很棒!

在Scala中最简单的方法是什么?

Ale*_*nov 5

One其余的不是类型,而是工会案例.实际上Scala等价物确实使它们成为类型:

sealed trait MyFiveNumbers

case object One extends MyFiveNumbers

case object Two extends MyFiveNumbers

...
Run Code Online (Sandbox Code Playgroud)

在这种简单的情况下,您最好只使用Java枚举.但是,如果任何构造函数具有参数(例如,添加| Other of int到结尾),则它们对应于Scala案例类:

case class Other(x: Int) extends MyFiveNumbers
Run Code Online (Sandbox Code Playgroud)

您可以像在F#中一样使用模式匹配:

// x has type MyFiveNumbers
x match {
  case One => ...
  ...
  case Other(n) => ...
}
Run Code Online (Sandbox Code Playgroud)

并获得有关不完整匹配的编译器警告(仅当使用sealed关键字时;否则您可以在其他文件中创建其他案例).