Скала не может умножить двойные java? - PullRequest
6 голосов
/ 09 октября 2009

Работая с классом Java в Scala, я заметил, что Scala не может умножить двойные значения 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
        ^

Вау! Я предполагаю, что это потому, что операторы Scala являются просто методами, поэтому он пытается вызвать метод умножения класса Java Double (т. Е. «34.0. * (2.1)»). К сожалению. Есть ли простой способ сделать это взаимодействие?

Ответы [ 3 ]

9 голосов
/ 09 октября 2009

Я бы определил неявное преобразование в Scala Double

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

Теперь ваш код работает! Аналогично работают выражения типа 1.2 + x. А из-за кода автобокса, подобного следующему, компиляция не требует неявных преобразований.

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

- Flaviu Cipcigan

1 голос
/ 14 октября 2009

Для «нативных» двойников проблем нет (пробовал в scalainter 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

То, как java.lang.Double представлен, кажется немного странным, хотя ...

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

Похоже, преобразование в "родные" двойники - лучший подход ...

0 голосов
/ 10 октября 2009

Я подозреваю, что вы вводите x * y вместо x * y Пробелы важны, поскольку синтаксический анализатор scala допускает использование не алфавитно-цифровых символов в идентификаторах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...