Quelles sont les différences entre Int et Integer dans Scala?

Je travaillais avec une variable que j’avais déclarée en tant qu’Integer et j’ai découvert que> n’est pas membre d’Integer. Voici un exemple 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 ^ 

Comparez cela à un Int:

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

Quelles sont les différences entre Integer et Int? Je vois l’avertissement de dépréciation mais je ne comprends pas pourquoi il a été déprécié et, étant donné qu’il l’a été, pourquoi il ne possède pas de méthode>.

“Quelles sont les différences entre Integer et Int?”

Integer est juste un alias pour java.lang.Integer. Int est l’entier Scala avec les capacités supplémentaires.

En regardant dans Predef.scala, vous pouvez voir ceci:

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

Cependant, il existe une conversion implicite de Int en java.lang.Integer si vous en avez besoin, ce qui signifie que vous pouvez utiliser Int dans des méthodes qui prennent un entier.

Quant à la raison pour laquelle elle est obsolète, je ne peux que supposer que c’était pour éviter toute confusion sur le type d’entier avec lequel vous travailliez.

Je pense que le problème que vous rencontrez doit faire de la boxe / unboxing des types de valeur et de l’utilisation de la classe Java Integer.

Je pense que la réponse est ici: boxe et unboxing à Scala . Il n’y a pas unboxing implicite dans Scala. Vous avez défini i comme la classe Java Integer mais dans le i> 3 , le 3 est en cours de traitement et un int.

Integer est importé depuis java.lang.Integer et est uniquement compatible avec Java. Comme il s’agit d’une classe Java, bien sûr, il ne peut pas avoir de méthode appelée “<". EDIT: vous pouvez atténuer ce problème en déclarant une conversion implicite de Integer à Int.

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

Vous aurez quand même un avertissement de dépréciation.

Integer est une classe Java, java.lang.Integer . C’est différent du type primitif de Java int , qui n’est pas une classe. Il ne peut pas y avoir < défini, car Java ne permet pas de définir des opérateurs pour les classes.

Maintenant, vous pourriez vous demander pourquoi un tel type existe du tout? Eh bien, les types primitifs ne peuvent pas être passés en tant que références, vous ne pouvez donc pas passer un int à une méthode qui attend java.lang.Object , équivalente à AnyRef de Scala, par exemple. Pour ce faire, vous mettez cet int dans un object Integer , puis transmettez le Integer .

Integer est importé depuis java.lang.Integer et est uniquement compatible avec Java. Comme il s’agit d’une classe Java, bien sûr, il ne peut pas avoir de méthode appelée “<".

EDIT: vous pouvez atténuer ce problème en déclarant une conversion implicite de Integer à Int.