2017-06-09 4 views
3

habe ich versucht, den folgenden Code:scala früh initializer mit var Ursache Classcast

class C(val g: Int => Int) 
object C { 
    object A extends { 
     var f: Int => Int = x => x 
    } with C(x => f(x) + 1) 

    def main(args: Array[String]): Unit = { 
     println(A.g(3)) 
    } 
} 

It (bei scala Version 2.12.2) zusammenstellen können, aber Exception zur Laufzeit wirft:

Exception in thread "main" java.lang.ExceptionInInitializerError 
    at pkg1.C$.main(C.scala:14) 
    at pkg1.C.main(C.scala) 
Caused by: java.lang.ClassCastException: scala.runtime.ObjectRef cannot be cast to scala.Function1 
    at pkg1.C$A$.<init>(C.scala:10) 
    at pkg1.C$A$.<clinit>(C.scala) 
    ... 2 more 

Warum Dies geschieht?

+0

Sind Sie sicher, dass Ihr Code kompiliert? Ich kann es nicht mit scala 2.11.8 kompilieren. Es schlägt mit 'scala.reflect.internal.Types $ TypeError fehl: type mismatch; gefunden: runtime.ObjectRef; erforderlich: Funktion1' –

+0

Ich denke, der Code kompiliert nicht –

+0

Ich benutze Scala Version 2.12 –

Antwort

1

Dies ist wahrscheinlich ein scalac Fehler (/ unbeabsichtigte Störungen von Funktionen der frühen Initialisierung von Variablen und Typklasse Typenbezeichnungen Lambda), verursacht durch Verfahren unter Verwendung von Griffen für Funktionen von 2.12 Start:

Scala and Java 8 interop is also improved for functional code, as methods that take functions can easily be called in both directions using lambda syntax. The FunctionN classes in Scala’s standard library are now Single Abstract Method (SAM) types, and all SAM types are treated uniformly – from type checking through code generation. No class file is generated for a lambda; invokedynamic is used instead.

Edit: Ich konnte keine gute Problemumgehung für dieses Problem neben der Änderung der var zu val finden, aber ich denke, das ist in Ihrem Anwendungsfall nicht möglich.