2009-10-14 13 views

Odpowiedz

19

To pytanie jest prawie duplikat: Scala can't multiply java Doubles? - można patrzeć na my answer jak dobrze, że idea jest podobna.

Jak Eastsun już zasugerował, że odpowiedź jest niejawna konwersja z java.lang.Integer (w zasadzie zapakowane int prymitywna) do scala.Int, który to sposób Scala reprezentowania JVM prymitywne całkowitymi.

Osiągnięto interoperacyjność - podany kod powinien zostać skompilowany dobrze! Kod, który używa scala.Int, gdzie java.lang.Integer jest potrzebny, wydaje się działać dobrze z powodu autoboxingu. Więc następujące prace:

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

Ponadto, jak michaelkebe powiedział, nie używaj typ Integer - co jest właściwie skrótem scala.Predef.Integer jak to jest przestarzałe i najprawdopodobniej zostanie usunięta w Scala 2.8.

EDIT: Ups ... zapomniałem odpowiedzieć na pytanie dlaczego. Błąd, który otrzymałeś, prawdopodobnie spowodował, że scala.Predef.Integer próbował naśladować syntaktyczny cukier Javy, gdzie a + "my String" oznacza konkatenację ciągów, a to int. Dlatego metoda + w typie scala.Predef.Integer wykonuje tylko konkatenację ciągów (oczekiwanie typu String) i nie dodaje naturalnej liczby całkowitej.

- Flaviu Cipcigan

0

Przede wszystkim należy użyć java.lang.Integer zamiast Integer.

Obecnie nie wiem, dlaczego wystąpił błąd.

a jest instancją java.lang.Integer i ten typ nie ma metody o nazwie +. Ponadto nie ma żadnej niejawnej konwersji na Int.

Aby rozwiązać ten problem można spróbować to:

 
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