Joe*_*e K 3 types scala type-safety
我有一个图表,其中每个顶点都有一个ID(永远不会改变)和一个标签(经常变化).两者都以长子为代表.
目前,我定义了以下类型:
type VertexId = Long
type VertexLabel = Long
Run Code Online (Sandbox Code Playgroud)
但是,我今天发现了一个错误,我将VertexLabel传递给了一个期望VertexId的函数.这似乎是scala编译器应该能够阻止的类型.
我考虑过这样做:
case class VertexId(id: Long)
case class VertexLabel(label: Long)
Run Code Online (Sandbox Code Playgroud)
但随后还有"拳击"和"拆箱"的额外开销以及一些额外的内存使用量.
反正是为了获得两全其美?将这两种类型定义为Longs,以便编译器阻止您使用另一种类型?
是的,您可以使用值类:
case class VertexId(val id: Long) extends AnyVal
case class VertexLabel(val label: Long) extends AnyVal
Run Code Online (Sandbox Code Playgroud)
请参阅http://docs.scala-lang.org/overviews/core/value-classes.html