我写了以下简单的程序:
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)
程序打印:
MyValueClass
int
但我预计它会打印
MyValueClass
MyValueClass
为什么构造函数int
的参数,而不是MyValueClass
?
答案 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
基元类型处理。