Scala类型 - 安全性与开销(类型与类)

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,以便编译器阻止您使用另一种类型?

Lee*_*Lee 9

是的,您可以使用值类:

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