我知道@specialized
类和值类是如何工作的,我知道我不能像以下那样拥有专门的值类:
class MilliVolt[@specialized T](val content :T) extends AnyVal //illegal
我无法找到获得类似效果的方法:使用单个声明创建一个用户类型/类型构造函数,可以作为几个java原语的纯语法包装器 - 是否可以解决此限制?
价值观课程背后的主要动机之一就是“注释”'具有业务含义的值类型,并创建与其数据类型不同的类型:
class MilliVolts(val count :Long) extends AnyVal
只要你静态地知道盒装类型,这种方法就可以正常工作,但是如果你想将几个不同的基元视为毫伏,你可以选择为每个基元创建一个新的包装器,或者使用泛型为了他们的目的:
trait Scale
trait millivolts extends Scale
trait milliampere extends Scale
class of[N, U<:Scale](val amount :N) extends AnyVal
val voltage :Long of millivolts = new of(1L)
val current :Int of milliampere = new of(1)
这很好,确实of
包装器在编译时被删除了,但不幸的是原始文件被装入他们的java包装器和两个字段
编译为:
Integer voltage = scala.Long.box(1L)
Integer current = scala.Int.box(1)
而不是long
和int
字段。
是否可以编写以下代码: