5 Stimmen

Strukturelle Typen und Primitiven

Ich habe mit Strukturtypen von Scala herumgespielt, als ich einen Fehler entdeckt habe, der mir seltsam erscheint. Hier ist mein Code:

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

Und ich habe diesen Fehler erhalten:

java.lang.NoSuchMethodException
at scala.runtime.BoxesRunTime.toDouble(Unknown Source)
at .foo(:9)
at .(:11)
at .()
at .(:11)
at .()
at $print()
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)

Zum einen weiß ich nicht, warum es nicht funktioniert. Zum anderen ist es seltsam, dass der Code einwandfrei kompiliert und zur Laufzeit eine Ausnahme wirft, die besagt, dass die Methode tatsächlich nicht existiert.

Hat jemand eine Erklärung dafür?

6voto

drexin Punkte 24117

Ich habe gerade ein wenig damit herumgespielt und es scheint wirklich ein Bug zu sein. Allerdings funktioniert es, wenn man den Rückgabetyp einfach auf Any setzt:

type toD = { def toDouble: Any }

Ich denke, es könnte etwas mit Auto-Boxing und der Art und Weise, wie Primitivtypen behandelt werden, zu tun haben.

Bearbeitet:

Ich habe gerade einen Workaround gefunden:

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

Dies stellt sicher, dass der Rückgabewert von toDouble (A) Double ist

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X