2009-10-09 9 views
6

Beim Arbeiten mit einer Java-Klasse in Scala habe ich festgestellt, dass Scala Java-Double nicht multiplizieren kann. Hier ein Beispiel:Scala kann Java Double nicht multiplizieren?

scala> val x:java.lang.Double = new java.lang.Double(34.0) 
x: java.lang.Double = 34.0 

scala> val y:java.lang.Double = new java.lang.Double(2.1) 
y: java.lang.Double = 2.1 

scala> x*y 
<console>:7: error: value * is not a member of java.lang.Double 
     x*y 
     ^

Whoa! Ich nehme an, es liegt daran, dass Scala-Operatoren nur Methoden sind, also versucht man, die Multiplikationsmethode der Java-Double-Klasse aufzurufen (zB "34.0. * (2.1)"). Hoppla. Gibt es einen einfachen Weg, diese Interop zu machen?

+4

in 2.9 getestet: die jetzt –

Antwort

8

würde ich eine implizite Umwandlung in eine Scala Double

implicit def javaToScalaDouble(d: java.lang.Double) = d.doubleValue 

Jetzt Ihr Code funktioniert definieren! Und ähnlich funktionieren auch Ausdrücke wie 1.2 + x. Und aufgrund des automatischen Box-Codes wie folgt kompiliert, ohne implizite Konvertierungen zu erfordern.

def foo(d: java.lang.Double) = println(d) 
val z: scala.Double = 1.2 
foo(z) 

- Flaviu Cipcigan

-15

Ich vermute, Sie x * y statt x * y Die Räume sind wichtig eingeben, da der scala-Parser für nicht-alphanumerischen Zeichen in Bezeichnern erlaubt.

+15

diese Antwort ist ganz falsch festgelegt worden ist. Nicht alphanumerische Zeichen * sind erlaubt, verursachen aber keine Probleme. Der Ausdruck "x * y" wird genau deshalb als "x. * (Y)" (genau wie "x * y") analysiert, weil gemischte alphanumerische Zeichen durch Unterstriche in Identifikatoren begrenzt sein müssen. Also ist "x *" * nicht * ein gültiger Bezeichner, aber 'x_ *' ist. –

1

Für die "native" Doubles gibt es kein Problem (versucht, dies in scala Interpreter 2.7.5):

scala> val a = 34D 
a: Double = 34.0 

scala> val b=54D 
b: Double = 54.0 

scala> val c = a+b 
c: Double = 88.0 

scala> val c=a*b 
c: Double = 1836.0 

Die Art und Weise java.lang.Double dargestellt wird, scheint aber ein bisschen seltsam. ..

scala> val t:java.lang.Double = new java.lang.Double(4) 
t: java.lang.Double = 4.0 

scala> val s:java.lang.Double = new java.lang.Double(4) 
s: java.lang.Double = 4.0 

scala> val i = s+t 
<console>:6: error: type mismatch; 
found : java.lang.Double 
required: String 
     val i = s+t 
       ^

scala> val i = s.doubleValue+t.doubleValue 
i: Double = 8.0 

wie Umwandlung Sieht „native“ Double ist der beste Ansatz ...

Verwandte Themen