2012-04-06 87 views
5

當我發現什麼看起來像是一個bug時,我正在玩Scala的結構類型。這裏是我的代碼:結構類型和圖元

type toD = { def toDouble: Double } 
def foo(t: toD) = t.toDouble 
foo(5) 

而且我得到了這個錯誤:

java.lang.NoSuchMethodException 
at scala.runtime.BoxesRunTime.toDouble(Unknown Source) 
at .foo(<console>:9) 
at .<init>(<console>:11) 
at .<clinit>(<console>) 
at .<init>(<console>:11) 
at .<clinit>(<console>) 
at $print(<console>) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
at java.lang.reflect.Method.invoke(Unknown Source) 
at scala.tools.nsc.interpreter.IMain$ReadEvalPrint.call(IMain.scala:704) 
at scala.tools.nsc.interpreter.IMain$Request$$anonfun$14.apply(IMain.scala:920) 
at scala.tools.nsc.interpreter.Line$$anonfun$1.apply$mcV$sp(Line.scala:43) 
at scala.tools.nsc.io.package$$anon$2.run(package.scala:25) 
at java.lang.Thread.run(Unknown Source) 

首先,我不知道爲什麼這是行不通的。其次,代碼編譯得很好並且在運行時拋出一個異常並且實際上並不存在,這很奇怪。

有沒有人對此有過解釋?

+3

注意,這個例子在斯卡拉2.10開發版工作。但這並不是說整個結構類型和盒裝原始的混亂區域都被徹底消毒了。 – Debilski 2012-04-06 11:17:42

+0

另一個混亂的解決方法:'foo(5.asInstanceOf [toD])'工作。 – Jus12 2012-04-13 21:01:46

回答

6

我只是玩了一下這個,它確實似乎是一個錯誤。

type toD = { def toDouble: Any } 

我認爲它可能有一些做與自動裝箱和原語的處理方式:但是當你剛剛設置的返回類型的任何工作。

編輯:

我只是找到了一個解決辦法:

type toD[A] = { def toDouble: A } 
def foo[A](x: toD[A])(implicit y: A =:= Double) = x.toDouble 

這保證,即toDouble(A)的返回值是雙

+1

增加了解決方法 – drexin 2012-04-06 12:19:43