Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有可能在scala中获得特殊值类的效果吗?_Scala_Generics_Autoboxing_Value Class_Specialized Annotation - Fatal编程技术网

有可能在scala中获得特殊值类的效果吗?

有可能在scala中获得特殊值类的效果吗?,scala,generics,autoboxing,value-class,specialized-annotation,Scala,Generics,Autoboxing,Value Class,Specialized Annotation,我知道@specialized类和值类是如何工作的,我知道我不能像下面那样拥有一个专门的值类: class MilliVolt[@specialized T](val content :T) extends AnyVal //illegal 我找不到一种方法来获得类似的效果:用一个声明创建一个用户类型/类型构造函数,它可以作为几个java原语的纯语法包装器——是否可以解决这个限制 价值类背后的一个主要动机是“注释”具有业务意义的价值类型,并创建与数据类型不同的类型: class MilliVo

我知道
@specialized
类和值类是如何工作的,我知道我不能像下面那样拥有一个专门的值类:

class MilliVolt[@specialized T](val content :T) extends AnyVal //illegal
我找不到一种方法来获得类似的效果:用一个声明创建一个用户类型/类型构造函数,它可以作为几个java原语的纯语法包装器——是否可以解决这个限制

价值类背后的一个主要动机是“注释”具有业务意义的价值类型,并创建与数据类型不同的类型:

class MilliVolts(val count :Long) extends AnyVal
只要您静态地知道盒装类型,这就可以很好地工作,但是如果您想将几个不同的原语视为毫伏,您可以选择为每个原语创建一个新的包装器,或者使用generic实现它们的设计目的:

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)
而不是
long
int
字段

是否可以编写以下代码:

  • 允许使用单个声明创建新的此类包装(新的“单元”类型)
  • 对这样的包装器执行一般操作,至少在底层原语方面(以毫伏为单位操作的方法,从装箱原语中提取)
  • 当包装器类型和基础基元类型都完全实例化(不是泛型类型的类型参数)并且调用的方法可以内联时(因此我可以为所有当前和将来的单元定义一次加法),不执行装箱
  • 理想情况下,不依赖于客户端代码中的宏(只要IDE可以理解类型声明本身,实现中的用法就可以了)
Integer voltage = scala.Long.box(1L)
Integer current = scala.Int.box(1)