2012-04-06 21 views
5

Scala'nın yapısal tipleri ile uğraşırken, bana bir böcek gibi görünen şeyi keşfettim. İşte benim kodudur:Yapısal tipler ve ilkeller

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

Ve bu hata var: Bu neden çalışmadığını

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) 

Birincisi, bilmiyorum. İkincisi, kodun düzgün bir şekilde derlenmesi ve yöntemin gerçekte varolmadığını söyleyen bir istisna atması gariptir.

Bunun için herhangi bir açıklaması var mı?

+3

Not olduğunu

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

Bu garanti, . Ama bu, tüm yapısal alanların ve kutulu primitif alanların tamamen temizlendiğini söylemiyor. – Debilski

+0

Başka bir dağınık geçici çözüm: foo (5.asInstanceOf [toD]) 'çalışır. – Jus12

cevap

6

Sadece bununla biraz uğraştım ve gerçekten bir hata gibi görünüyor.

type toD = { def toDouble: Any } 

Ben oto boks ve ilkel işlenme biçimindeki bir ilgisi olabilir düşünüyorum: Sadece Herhangi dönüş türünü ayarlamak Ancak işe yarıyor.

düzenleme: Sadece geçici bir çözüm buldu

: toDouble (A) dönüş değeri bu örnek Scala 2.10 gelişme sürümde çalıştığını Çift

+1

eklenmiş geçici çözüm – drexin

İlgili konular