在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)”)。哎呀。有没有一种简单的方法来实现这种互操作?
答案 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解析器允许标识符中包含非字母数字字符。