2009-10-09 19 views
6

Mientras trabajaba con una clase Java en Scala, noté que Scala no puede multiplicar Java Dobles. Aquí hay un ejemplo:Scala no puede multiplicar dobles de Java?

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! Supongo que es porque los operadores de Scala son solo métodos, por lo que se trata de llamar al método de multiplicar de la clase Double de Java (es decir, "34.0. * (2.1)"). Oops. ¿Hay alguna manera fácil de hacer esta interoperabilidad?

+4

Probado en 2.9: esto ya se ha solucionado –

Respuesta

8

Yo definiría una conversión implícita a un Scala Double

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

Ahora funciona su código! Y expresiones similares como 1.2 + x también funcionan. Y debido al código de auto-boxing como el siguiente, se compila sin requerir conversiones implícitas.

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

- Flaviu Cipcigan

-15

sospecho que está entrando x * y en lugar de x * y Los espacios son importantes, ya que el analizador Scala permite caracteres no alfanuméricos en identificadores.

+15

esta respuesta es muy mal. Los caracteres * no * alfanuméricos * están * permitidos, pero no causan problemas como este. La expresión 'x * y' se analiza como' x. * (Y) '(exactamente lo mismo que' x * y') precisamente porque los caracteres mixtos alfa/no alfanuméricos deben delimitarse en identificadores que usan guiones bajos. Por lo tanto, 'x *' es * no * un identificador válido, pero 'x_ *' es. –

1

Para el "nativo" dobles no hay ningún problema (en este tratado intérprete Scala 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 

La forma java.lang.Double está representado, parece que hay un poco extraño sin embargo. ..

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 

Parece que la conversión a "nativo" de dobles es el mejor enfoque ...

Cuestiones relacionadas