¿Cuál es la diferencia entre Int y Integer en Scala?

Estaba trabajando con una variable que había declarado como un Entero y descubrí que> no es miembro de Entero. Aquí hay un ejemplo simple:

scala> i warning: there were deprecation warnings; re-run with -deprecation for details res28: Integer = 3 scala> i > 3 :6: error: value > is not a member of Integer i > 3 ^ 

Compare eso con un Int:

 scala> j res30: Int = 3 scala> j > 3 res31: Boolean = false 

¿Cuáles son las diferencias entre Integer e Int? Veo la advertencia de desaprobación, pero no estoy seguro de por qué fue desaprobada y, dado que lo ha sido, por qué no tiene un método>.

“¿Cuáles son las diferencias entre Integer e Int?”

Integer es solo un alias para java.lang.Integer. Int es el número entero de Scala con las capacidades adicionales.

Mirando en Predef.scala puedes ver este el alias:

  /** @deprecated use java.lang.Integer instead */ @deprecated type Integer = java.lang.Integer 

Sin embargo, hay una conversión implícita de Int a java.lang.Integer si lo necesita, lo que significa que puede usar Int en métodos que toman un Entero.

En cuanto a por qué está en desuso, solo puedo suponer que fue para evitar cualquier confusión sobre qué tipo de número entero estaba trabajando.

Creo que el problema que estás viendo tiene que ver con el boxeo / unboxing de tipos de valores y el uso de la clase Java Integer.

Creo que la respuesta está aquí: boxeo y unboxing en Scala . No hay implict unboxing en Scala. Has definido i como el entero de la clase Java pero en el i> 3 , el 3 está siendo tratado y un int.

El entero se importa de java.lang.Integer y solo es compatible con Java. Como es una clase de Java, por supuesto no puede tener un método llamado “< ". EDITAR: Puede mitigar este problema declarando una conversión implícita de Integer a Int.

  implicit def toInt(in:Integer) = in.intValue() 

Sin embargo, todavía recibirá una advertencia de desaprobación.

Integer es una clase Java, java.lang.Integer . Es diferente del tipo primitivo int de Java, que no es una clase. No puede tener < definido, porque Java no permite definir operadores para las clases.

Ahora, ¿podrías preguntarte por qué existe tal tipo? Bueno, los tipos primitivos no se pueden pasar como referencias, por lo que no se puede pasar un int a un método esperando java.lang.Object , equivalente a AnyRef de Scala, por ejemplo. Para hacer eso, pones ese int dentro de un objeto Integer , y luego pasas el Integer .

El entero se importa de java.lang.Integer y solo es compatible con Java. Como es una clase de Java, por supuesto no puede tener un método llamado “< ".

EDITAR: Puede mitigar este problema declarando una conversión implícita de Integer a Int.