具有ValueType参数的类

时间:2016-12-15 08:42:36

标签: scala class constructor

我写了以下简单的程序:

object Main extends App {
  println(s"${classOf[MyValueClass].getSimpleName}")
  val pt = classOf[MyClass].getDeclaredConstructors.asInstanceOf[Array[Constructor[MyClass]]].iterator.next.getParameterTypes
  pt.asInstanceOf[Array[Class[_]]] foreach { c =>
    println (c.getSimpleName)
  }
}

case class MyValueClass(v: Int) extends AnyVal

class MyClass(v: MyValueClass)

DEMO

程序打印:

MyValueClass
int

但我预计它会打印

MyValueClass
MyValueClass

为什么构造函数int的参数,而不是MyValueClass

1 个答案:

答案 0 :(得分:3)

因为MyValueClass仅使用AnyVal参数扩展val Int

  

编译时的类型是Wrapper,但在运行时,表示是Int   http://docs.scala-lang.org/overviews/core/value-classes.html

字节代码:

scala> :javap -c MyClass
Compiled from "<console>"
public class $line4.$read$$iw$$iw$MyClass {
  public $line4.$read$$iw$$iw$MyClass(int);
    Code:
       0: aload_0
       1: invokespecial #19                 // Method java/lang/Object."<init>":()V
       4: return
}

正如您可以看到字节码MyClass构造函数参数在编译后已作为int基元类型处理。