从密封特征中键入安全别名

时间:2013-08-31 17:47:43

标签: scala alias traits

有没有办法可以为密封特性设置别名,以便提供类型安全?我知道我可以编写一个案例类或者使用类型类,但是这些解决方案对我来说太过分了。

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

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

1 个答案:

答案 0 :(得分:2)

您可以改为声明隐式类:

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

隐式类的优势在于,只要需要LonLat,就可以使用双精度 - 这可以让您的分配工作,但根据您的使用情况,这可能过于宽松

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

或者,您可以使用Scalaz(example)或无形(example)使用“未装箱的新类型”技术。