Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.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 - Fatal编程技术网

Scala 值类实例化?

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

运行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 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
方法,而是在其父trait
IntWrapper
中定义,当您从一个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