trait IntWrapper[@specialized(Long, Int) T] extends Any {
def value: T
type I = Integral[T]
implicit def leFromInt(i: Int)(implicit i2: I): T = i2.fromInt(i)
implicit def leToInt(t: T)(implicit i2: I): Int = i2.toInt(t)
def nums(implicit i: I) = {
import i._
@tc def inner(remaind: T, acc: List[Int]): List[Int] = quot(remaind, 10) match {
case that if equiv(0, that) => rem(remaind, 10)::acc
case that => inner(that, rem(remaind, 10)::acc)
}
inner(value, Nil)
}
}
object Test {
implicit class intw(val value: Int) extends AnyVal with IntWrapper[Int]
def main(args: Array[String]): Unit = {
println{
3.nums
}
}
}
运行javap -c Test $ give
public void main(java.lang.String[]);
Code:
0: getstatic #24 // Field scala/Predef$.MODULE$:Lscala/Predef$;
3: new #26 // class Test$intw
6: dup
7: aload_0
8: iconst_3
9: invokevirtual #28 // Method intw:(I)I
12: invokespecial #31 // Method Test$intw."<init>":(I)V
15: getstatic #36 // Field scala/math/Numeric$IntIsIntegral$.MODULE$:Lscala/math/Numeric$IntIsIntegral$;
18: invokevirtual #40 // Method Test$intw.nums:(Lscala/math/Integral;)Lscala/collection/immutable/List;
21: invokevirtual #44 // Method scala/Predef$.println:(Ljava/lang/Object;)V
24: return
鉴于此
在以下情况下实际实例化值类:
将值类视为另一种类型。分配了一个值类 数组。进行运行时类型测试,例如模式匹配。
为什么要实例化intw?
答案 0 :(得分:1)
nums
方法未在intw
中定义,而是在其父特征IntWrapper
中定义,并且当您从特征中调用方法时,需要从值初始化继承值类。这是“值类被视为另一种类型”的实例。请参阅Scala网站上Value Classes and Universal Traits中的简介的最后部分和分配详细信息的第一部分。
在这种特殊情况下,可以消除初始化,但编译器目前还不够智能。在Value Classes proposal的末尾简要讨论了它。