Ich versuche, eine generische Methode für Objektaktualisierungen mit scala / java zu erstellen, aber ich kann die Klasse für einen Typparameter nicht abrufen.
Hier ist mein Code:
object WorkUnitController extends Controller {
def updateObject[T](toUpdate: T, body: JsonObject){
val source = gson.fromJson(body, classOf[T]);
...
}
}
Der Fehler, den ich bekomme, ist
Klassentyp erforderlich, aber T gefunden
Ich weiß, in Java kann man das nicht, aber ist das in Scala überhaupt möglich?
Vielen Dank!
Antworten:
Due Manifest ist veraltet (seit Scala 2.10.0) Dies ist die aktualisierte Antwort -
import scala.reflect.ClassTag import scala.reflect._ object WorkUnitController extends Controller { def updateObject[T: ClassTag](toUpdate: T, body: JsonObject){ val source = gson.fromJson(body, classTag[T].runtimeClass) ??? } }
Sie sollten
ClassTag
anstelle vonClassManifest
und.runtimeClass
anstelle von verwenden.erasure
Ursprüngliche Antwort - Ja, das können Sie mit Manifesten tun:
object WorkUnitController extends Controller { def updateObject[T: ClassManifest](toUpdate: T, body: JsonObject){ val source = gson.fromJson(body, classManifest[T].erasure); ... } }
quelle
manifest[T]
stattimplicitly[Manifest[T]]
.Manifest
undClassManifest
jetzt veraltet sind, mit ersetzt wurdeTypeTag
undClassTag
2,10 auf Scala, respectively.classTag[T].runtimeClass
mir brauchteclassTag[T].runtimeClass.asInstanceOf[Class[T]]
. Weiß jemand warum?Die Antwort von Vasil und Maxim hat mir geholfen.
Persönlich bevorzuge ich die Syntax, in
implicit
der solche Parameter hinzugefügt werden (die dargestellte: ClassTag
ist eine Abkürzung dafür. Für den Fall, dass jemand anderes dies auch als besseren Weg ansieht:import scala.reflect.ClassTag object WorkUnitController extends Controller { def updateObject[T](toUpdate: T, body: JsonObject)(implicit tag: ClassTag[T]){ val source = gson.fromJson(body, tag.runtimeClass) ??? } }
Haftungsausschluss: Ich habe das oben Gesagte nicht kompiliert, aber mein eigener ähnlicher Code funktioniert auf diese Weise.
quelle