2009-10-14 7 views

Respuesta

19

Esta pregunta es casi un duplicado de: Scala can't multiply java Doubles? - se puede ver en my answer así, ya que la idea es similar.

Como Eastsun ya se ha insinuado, la respuesta es un conversión implícita de un java.lang.Integer (básicamente un sistema encajonado int primitivo) a una scala.Int, que es la forma Scala de representar JVM enteros primitivos.

implicit def javaToScalaInt(d: java.lang.Integer) = d.intValue 

Y interoperabilidad se ha logrado - cortó el código que has dado debe compilar muy bien! Y el código que usa scala.Int donde se necesita java.lang.Integer parece funcionar bien debido al autoboxing. Por lo tanto, las siguientes obras:

def foo(d: java.lang.Integer) = println(d) 
val z: scala.Int = 1 
foo(z) 

También, como michaelkebe Dicho esto, no utilizan el tipo Integer - que en realidad es la abreviatura de scala.Predef.Integer ya que es obsoleto y muy probablemente va a ser eliminado en Scala 2.8.

EDIT: Oops ... se olvidó de responder el por qué. El error que obtiene es probablemente que el scala.Predef.Integer intentó imitar el azúcar sintáctico de Java donde a + "my String" significa concatenación de cadenas, a es un int. Por lo tanto, el método + en el tipo scala.Predef.Integer solo hace la concatenación de cadenas (esperando un tipo String) y no agrega números enteros naturales.

- Flaviu Cipcigan

0

En primer lugar debe utilizar java.lang.Integer en lugar de Integer.

Actualmente no sé por qué ocurre el error.

a es una instancia de java.lang.Integer y este tipo no tiene un método denominado +. Además, no hay una conversión implícita a Int.

Para resolver esto, puede intentar esto:

 
scala> val a: java.lang.Integer = 1 
a: java.lang.Integer = 1 

scala> val b: java.lang.Integer = a.intValue + 1 
b: java.lang.Integer = 2 
2
Welcome to Scala version 2.7.3.final (Java HotSpot(TM) Client VM, Java 1.6.0_16). 
Type in expressions to have them evaluated. 
Type :help for more information. 

scala> implicit def javaIntToScala(n: java.lang.Integer) = n.intValue 

javaIntToScala: (java.lang.Integer)Int 

scala> val a: java.lang.Integer = 1 

a: java.lang.Integer = 1 

scala> val b: java.lang.Integer = a + 1 

b: java.lang.Integer = 2