web-dev-qa-db-fra.com

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

Je travaillais avec une variable que j'avais déclarée en tant qu'entier 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
<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 pourquoi il a été déprécié et, étant donné qu'il l'a été, pourquoi il n'a pas de méthode.

52
pr1001

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

Integer n'est qu'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 l'alias:

 /** @deprecated use <code>Java.lang.Integer</code> instead */
  @deprecated type Integer = Java.lang.Integer

Cependant, il existe une conversion implicite d'Int vers Java.lang.Integer si vous en avez besoin, ce qui signifie que vous pouvez utiliser Int dans des méthodes qui acceptent un Integer.

Quant à savoir pourquoi il est déconseillé, je ne peux que présumer que c'était pour éviter toute confusion sur le type d'entier avec lequel vous travailliez.

43
Richard Dallaway

L'entier est importé de Java.lang.Integer et est uniquement pour la compatibilité avec Java. Comme il s'agit d'une classe Java classe, 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 en Int.

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

Vous obtiendrez toujours un avertissement de dépréciation.

5
Kim Stebel

Je pense que le problème que vous voyez a à faire avec la boxe/unboxing des types de valeur et l'utilisation de la classe Java Integer.

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

4
Valentein

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

Maintenant, vous vous demandez peut-être pourquoi un tel type existe? 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 attendant Java.lang.Object, équivalent à AnyRef de Scala, par exemple. Pour ce faire, vous placez ce int dans un objet Integer, puis passez le Integer.

2
Daniel C. Sobral

L'entier est importé de Java.lang.Integer et est uniquement pour la compatibilité avec Java. Comme il s'agit d'une classe Java classe, 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 en Int.

2
deepak