Scala不能乘以java双打?

时间:2009-10-09 18:00:59

标签: scala

在Scala中使用Java类时,我注意到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类的multiply方法(即“34.0。*(2.1)”)。哎呀。有没有一种简单的方法来实现这种互操作?

3 个答案:

答案 0 :(得分:9)

我会定义一个隐式转换为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 :(得分:1)

对于“原生”双打没有问题(在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

表示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

看起来转换为“原生”双打是最好的方法......

答案 2 :(得分:-15)

我怀疑你输入x * y而不是x * y 空格很重要,因为scala解析器允许标识符中包含非字母数字字符。