2009-10-09 70 views
6

在使用Scala中的Java類時,我注意到Scala不能乘以Java雙精度。這裏有一個例子:斯卡拉不能乘以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)」)。哎呀。有沒有簡單的方法來完成這個互操作?

+4

測試在2.9:這已得到修復 – 2012-04-26 12:02:26

回答

8

我將定義的隱式轉換到斯卡拉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

-15

我懷疑你正在進入X * Y代替X * Y 的空間是重要的,因爲Scala的解析器允許在標識符非字母數字字符。

+15

這個答案是非常錯誤的。非字母數字字符*是允許的,但它們不會導致這樣的問題。正則表達式'x * y'被解析爲'x。*(y)'(與'x * y'完全相同),因爲混合的字母/非字母數字字符必須在標識符中使用下劃線分隔。因此,'x *'不是*有效的標識符,而是'x_ *'是。 – 2009-10-10 02:53:28

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 

貌似轉換爲「本地」雙打是最好的辦法......