是否有可能在scala中获得专门的值类的效果?

时间:2016-05-25 14:44:37

标签: scala generics autoboxing value-class specialized-annotation

我知道@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)

而不是longint字段。

是否可以编写以下代码:

  • 允许使用单个声明创建新的此类包装器(新的&#39;单元&#39;类型);
  • 对这样的包装器执行泛型操作,至少就底层原语(在毫伏上操作的方法,从盒装原语中抽象)而言;
  • 在包装器类型和底层基元类型完全实例化时不执行装箱(不是泛型类型的类型参数),并且可以内联调用方法(因此我可以为所有当前和未来单元定义一次加法)
  • 理想情况下,
  • 不依赖于客户端代码中的宏(只要IDE可以理解类型声明本身,实现中的用法就可以了)

0 个答案:

没有答案