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
fonte
2009-10-14 15:49:21