3

有没有一种方法可以给密封特征起别名,以提供类型安全?我知道我可以编写一个案例类或求助于类型类,但是这些解决方案我想做的太过分了。

一个简单的例子来说明它:

type Lon = Double
type Lat = Double

def lonLatPair(lon:Lon, lat:Lat):(Lon, Lat) = (lon, lat) 

val someLon:Lon = 1.2
val someLat:Lat = 3.4

lonLatPair(someLon, someLat) // Success!
lonLatPair(someLat, someLon) // Dismal failure in the form of a type error
4

1 回答 1

2

您可以改为声明隐式类:

implicit class Lon(val value: Double) extends AnyVal
implicit class Lat(val value: Double) extends AnyVal

Lon隐式类的优点是您可以在需要 a或 a的任何时候使用双Lat精度 - 这允许您的分配工作,但这可能过于宽松,具体取决于您的用例。

extends AnyVal部分基本上意味着,在大多数情况下,使用LonLat代替本机类型没有运行时开销Double

或者,您可以使用 Scalaz ( example ) 或shapeless ( example ) 的“unboxed new type”技术。

于 2013-08-31T18:23:53.733 回答