2009-10-14 11 views

risposta

19

questa domanda è quasi un duplicato di: Scala can't multiply java Doubles? - si può guardare al my answer pure, come l'idea è simile.

Come Eastsun già accennato, la risposta è un implicito conversione da un java.lang.Integer (fondamentalmente una inscatolato int primitivo) ad una scala.Int, che è il modo di rappresentare Scala JVM interi primitive.

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

E l'interoperabilità è stata raggiunta - il codice tagliato che hai dato dovrebbe compilare bene! E il codice che utilizza scala.Int in cui è necessario il numero java.lang.Integer sembra funzionare correttamente a causa dell'autoboxing. Quindi, le seguenti opere:

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

Inoltre, come detto michaelkebe, non usano il tipo Integer - che è in realtà una scorciatoia per scala.Predef.Integer quanto è deprecato e molto probabilmente sta per essere rimosso in Scala 2.8.

MODIFICA: Oops ... ho dimenticato di rispondere al perché. L'errore che si ottiene è probabilmente che il scala.Predef.Integer ha tentato di simulare lo zucchero sintattico di Java dove a + "my String" significa concatenazione di stringhe, a è un int. Pertanto il metodo + nel tipo scala.Predef.Integer esegue solo concatenazione di stringhe (prevedendo un tipo String) e nessuna aggiunta di intero naturale.

- Flaviu Cipcigan

0

Prima di tutto è necessario utilizzare java.lang.Integer anziché Integer.

Attualmente non so perché si verifica l'errore.

a è un'istanza di java.lang.Integer e questo tipo non ha un metodo denominato +. Inoltre non esiste una conversione implicita a Int.

per risolvere questo si può provare questo:

 
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