2009-08-12 12 views
45

Estaba trabajando con una variable que había declarado como un Entero y descubrí que> no es miembro de Entero. Aquí está un ejemplo sencillo:¿Cuáles son las diferencias entre Int e Integer en 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 
     ^

Compare esto con un Int:

scala> j 
res30: Int = 3 

scala> j > 3 
res31: Boolean = false 

¿Cuáles son las diferencias entre los enteros 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>.

+0

Gracias, todas, por las útiles respuestas. Todos ustedes responden mi pregunta, así que dejaré que la respuesta mejor calificada suba a la cima y la marque como la respuesta. Mientras tanto, califiqué todas tus respuestas. – pr1001

Respuesta

40

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

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

Buscando en Predef.scala se puede ver esto el alias:

/** @deprecated use <code>java.lang.Integer</code> 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 se puede utilizar en Int métodos que toman un Entero.

En cuanto a por qué está obsoleto, solo puedo suponer que fue para evitar cualquier confusión sobre el tipo de entero con el que estaba trabajando.

3

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, seguirá recibiendo advertencia de obsolescencia.

4

Creo que el problema que está teniendo 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í: Boxing and unboxing in Scala. No hay implict unboxing en Scala. Ha definido i como el entero de clase Java pero en el i> 3, el 3 está siendo tratado y un int.

+0

el enlace está roto ahora. – 203

1

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

Ahora, ¿podría preguntarse 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 que espera java.lang.Object, equivalente a AnyRef de Scala, por ejemplo. Para hacer eso, coloca ese int dentro de un objeto Integer, y luego pase el Integer.

1

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.

Cuestiones relacionadas