2016-01-01 4 views
2

Я новичок в Scala, и я не понимаю:Почему getClass возвращает другое значение для параметра конструктора case case при запросе извне класса case?

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 

После строительства он возвращает «класса java.lang.Integer», при запросе вне класса случае она возвращает «INT».

ответ

3

Это автоматический (un) бокс. JVM требует, чтобы T был подклассом Object для использования в качестве параметра общего типа, поэтому value фактически является Integer. Вне стандартного кода, когда компилятор знает конкретный тип value, он распаковывает его для вас, так что он становится int.

Обратите внимание, что это не имеет никакого отношения к классам case (или классам вообще, если на то пошло), это просто артефакт того, как реализуются параметры типа и классы значений. Попробуйте это:

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

Это будет печатать:

class java.lang.Integer 
int 
+0

Да, чтобы было ясно, я хотел бы добавить, что это не имеет ничего общего с тематическими классами, но только типичности – Dici

Смежные вопросы