2012-04-06 71 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