2009-10-14 22 views
14

Ich tippen diese das scala-Interpreter:Int vs Integer: Typenkonflikt, gefunden: Int, erforderlich: String

val a : Integer = 1; 
val b : Integer = a + 1; 

Und ich bekomme die Meldung:

<console>:5: error: type mismatch; 
found : Int(1) 
required: String 
     val b : Integer = a +1 
          ^

Warum? Wie kann ich das lösen? Dieses Mal brauche ich aufgrund von Java Interoperabilität Gründen Integer.

Antwort

19

Diese Frage ist fast ein Duplikat: Scala can't multiply java Doubles? - Sie auch bei my answer aussehen kann, wie die Idee ähnlich ist.

Eastsun Wie bereits angedeutet, ist die Antwort eine implizite Konvertierung von einem java.lang.Integer zu einem scala.Int (im Grunde ein int primitiver eingerahmt), die die Art und Weise der Scala repräsentierte JVM primitive ganze Zahlen ist.

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

Und Interoperabilität wurde erreicht - der Code, den Sie geschnitzt haben, sollte kompilieren, einfach gut! Und Code, der scala.Int verwendet, wo java.lang.Integer benötigt wird, scheint wegen Autoboxen gut zu funktionieren. So sind die folgenden Werke:

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

Auch als michaelkebe sagte, verwenden Sie nicht die Integer Typ - die für scala.Predef.Integer eigentlich eine Abkürzung ist, da es veraltet ist und höchstwahrscheinlich wird sich in Scala 2.8 entfernt werden.

EDIT: Hoppla ... vergessen zu beantworten, warum. Der Fehler, den Sie erhalten, ist wahrscheinlich, dass der scala.Predef.Integer Java-syntaktischen Zucker nachzuahmen versuchte, wobei a + "my String" String-Verkettung bedeutet, a ist ein int. Daher führt die +-Methode im scala.Predef.Integer-Typ nur String-Verkettung (erwartet einen String-Typ) und keine natürliche ganzzahlige Addition.

- Flaviu Cipcigan

0

Zuerst sollten Sie java.lang.Integer anstelle von Integer verwenden.

Derzeit weiß ich nicht, warum der Fehler auftritt.

a ist eine Instanz von java.lang.Integer und dieser Typ hat keine Methode namens +. Außerdem gibt es keine implizite Konvertierung nach Int.

Um dies zu lösen, können Sie dies versuchen:

 
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