Scala 值类实例化?
运行javap-c测试$Scala 值类实例化?,scala,Scala,运行javap-c测试$ 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 n
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
}
}
}
publicsvoidmain(java.lang.String[]);
代码:
0:getstatic#24//字段scala/Predef$.MODULE$:Lscala/Predef$;
3:新的#26//类测试$intw
6:dup
7:aload_0
8:iconst_3
9:invokevirtual#28//方法intw:(I)I
12:invokespecial#31//方法测试$intw.“:(I)V
15:getstatic#36//字段scala/math/Numeric$IntIsIntegral$。模块$:Lscala/math/Numeric$IntIsIntegral$;
18:invokevirtual#40//方法测试$intw.nums:(Lscala/math/Integral;)Lscala/collection/immutable/List;
21:invokevirtual#44//方法scala/Predef$.println:(Ljava/lang/Object;)V
24:返回
鉴于此
值类实际上是在以下情况下实例化的:
值类被视为另一种类型。一个值类被指定给
数组。执行运行时类型测试,例如模式匹配
为什么要实例化intw?在
intw
中没有定义nums
方法,而是在其父traitIntWrapper
中定义,当您从一个trait调用方法时,需要值类从初始化继承的trait。这是“值类被视为另一种类型”的实例。请参阅Scala网站上的介绍的最后一部分和分配详细信息的第一部分
在这种特殊情况下,可以取消初始化,但编译器目前还没有足够的智能来完成这项工作。本文最后简要地讨论了这一点
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