当从案例类外部查询时,为什么getClass在案例类构造函数参数上返回不同的值?

时间:2016-01-01 14:25:00

标签: scala class types case-class

我是Scala的新手,我不明白这一点:

scala> case class foo[T](value:T){println(value.getClass.toString)}
defined class foo

scala> val bar=foo(1)
class java.lang.Integer
bar: foo[Int] = foo(1)

scala> println(bar.value.getClass.toString)
int

在构造时它返回'class java.lang.Integer',当在case类之外查询时它返回'int'。

1 个答案:

答案 0 :(得分:3)

这是自动(联合)拳击。 JVM要求TObject的子类,以用作泛型类型参数,因此value实际上是Integer。 在通用代码之外,当编译器知道value的具体类型时,它会为您取消装箱,以便它变为int

请注意,它与case类(或者根本就没有类)无关,它只是一个关于如何实现类型参数和值类的工件。试试这个:

 def foo[T](value: T) = { println(value.getClass); value }
 println(foo(1).getClass)

这将打印:

 class java.lang.Integer
 int