为什么值类不能包装另一个值类?

时间:2017-09-08 12:37:46

标签: scala class jvm language-design

是否有理由限制一个值类无法包装另一个值类?

这似乎是一件显而易见的事情,并将好处进一步扩展到类层次结构中。如果A可以被视为仅编译时,并且在幕后使用类class C(val y: B) extends AnyVal,那么B可以做同样的事情会很好。它以透明方式实现为A,它在JVM中在运行时透明地实现为C,因此所有效率和gc开销优势都延续到类{{1}}。

为什么要限制?

1 个答案:

答案 0 :(得分:3)

这是一项实施限制。它在Dotty被解除了:

$ dotr
Starting dotty REPL...
scala> case class C1(i: Int) extends AnyVal
// defined case class C1
scala> case class C2(c1: C1) extends AnyVal
// defined case class C2
scala> val x = C2(C1(1))
val x: C2 = C2(C1(1))