59 votes

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

Je travaillais avec une variable que j'avais déclarée comme étant un Integer et j'ai découvert que > n'est pas un membre de Integer. Voici un exemple simple :

scala> i
warning: there were deprecation warnings; re-run with -deprecation for details
res28: Integer = 3

scala> i > 3
<console>: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 bien pourquoi il a été déprécié et, étant donné qu'il l'a été, pourquoi il n'a pas de méthode >.

0 votes

Merci à tous pour ces réponses utiles. Vous répondez tous à ma question, je vais donc laisser la réponse la mieux notée s'imposer et la marquer comme réponse. En attendant, j'ai donné une note supérieure à toutes vos réponses.

53voto

Richard Dallaway Points 595

"Quelles sont les différences entre Integer et Int ?

Integer est juste un alias de java.lang.Integer. Int est l'entier Scala avec des capacités supplémentaires.

En regardant dans Predef.scala, vous pouvez voir cet alias :

 /** @deprecated use <code>java.lang.Integer</code> 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 les méthodes qui prennent un Integer.

Quant à la raison pour laquelle il est déprécié, je ne peux que supposer que c'est pour éviter toute confusion sur le type d'entier avec lequel vous travaillez.

6voto

Kim Stebel Points 22873

Integer est importé de java.lang.Integer et n'est utilisé que pour la compatibilité avec Java. Comme il s'agit d'une classe Java, elle ne peut évidemment pas avoir de méthode appelée "<". EDIT : Vous pouvez atténuer ce problème en déclarant une conversion implicite de Integer vers Int.

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

Cependant, vous recevrez toujours un avertissement de dépréciation.

4voto

Valentein Points 187

Je pense que le problème que vous rencontrez est lié à l'encapsulation/décapsulation des types de valeurs et à l'utilisation de la classe Java Integer.

Je pense que la réponse se trouve ici : La boxe et l'unboxing en Scala . Il n'y a pas d'unboxing implicite en Scala. Vous avez défini i comme la classe Java Integer, mais dans la classe i > 3 , le 3 est traité et un int.

2 votes

Le lien est cassé maintenant.

4voto

Daniel C. Sobral Points 159554

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

Vous vous demandez peut-être pourquoi un tel type de produit existe ? Eh bien, les types primitifs ne peuvent pas être transmis en tant que références, de sorte que vous ne pouvez pas transmettre un type int à une méthode qui attend java.lang.Object équivalente à celle de Scala AnyRef par exemple. Pour ce faire, vous mettez que int à l'intérieur d'un Integer puis transmet l'objet Integer .

3voto

deepak Points 19

Integer est importé de java.lang.Integer et n'est utilisé que pour la compatibilité avec Java. Comme il s'agit d'une classe Java, elle ne peut évidemment pas avoir de méthode appelée "<".

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X