2009-08-12 7 views
45

Je travaillais avec une variable que j'avais déclarée en tant qu'entier et j'ai découvert que> n'est pas un membre d'Integer. Voici un exemple simple:Quelle est la différence entre Int et Integer dans Scala?

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 à une Int:

scala> j 
res30: Int = 3 

scala> j > 3 
res31: Boolean = false 

Quelles sont les différences entre les nombres entiers 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.

+0

Merci à tous pour les réponses utiles. Vous répondez tous à ma question, alors je vais laisser la réponse la mieux notée monter au sommet et marquer cela comme la réponse. En attendant, j'ai noté toutes vos réponses. – pr1001

Répondre

40

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

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

regardant dans Predef.scala vous pouvez voir ce l'alias:

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

Cependant, il y a une conversion implicite de Int à java.lang.Integer si vous en avez besoin, ce qui signifie que vous pouvez utiliser dans Int méthodes qui prennent un entier. Pour ce qui est de savoir pourquoi il est obsolète, je ne peux que supposer que c'était pour éviter toute confusion sur le type d'entier avec lequel vous travailliez.

3

Le nombre entier est importé de java.lang.Integer et est seulement pour la compatibilité avec Java. Comme il s'agit d'une classe Java, il est impossible d'avoir une 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 recevrez quand même un avertissement de désapprobation.

4

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

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

+0

le lien est cassé maintenant. – 203

1

Integer est une classe Java, java.lang.Integer. C'est différent du type primitif Java int, qui n'est pas une classe. Il ne peut pas avoir < défini, car Java n'autorise pas la définition d'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, donc vous ne pouvez pas passer un int à une méthode qui attend java.lang.Object, équivalent à AnyRef de Scala, par exemple. Pour ce faire, vous mettez ce int à l'intérieur d'un objet Integer, puis passez le Integer.

1

Le nombre entier est importé de java.lang.Integer et est seulement pour la compatibilité avec Java. Comme il s'agit d'une classe Java, il est impossible d'avoir une méthode appelée "<".

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

Questions connexes