2016-06-09 12 views
0

ich eine Methode, wie diese zu schreiben versuchen:Scala: Mit TypeTag in einem Verfahren

def foo[T:TypeTag](value: Int):String = { 
    (/* do something */).mapTo[T].map(_.toJson) 
} 

wo mapTo die Signatur hat:

def mapTo[S](implicit tag: ClassTag[S]): Future[S] = { ... } 

org.scala-lang.scala-reflect mit der Lage sein, etwas zu tun:

foo[String](1), foo[List[Double]](10) und so weiter.

Ich habe versucht, es auf verschiedene Arten zu schreiben, aber ich habe verschiedene Kompilierfehler. Gibt es eine Möglichkeit, so etwas zu machen?

Error:(26, 45) Cannot find JsonWriter or JsonFormat type class for T 
    (/* do something */).mapTo[T].map(_.toJson) 
              ^
Error:(26, 45) not enough arguments for method toJson: (implicit writer: spray.json.JsonWriter[T])spray.json.JsValue. 
Unspecified value parameter writer. 
    (/* do something */).mapTo[T].map(_.toJson) 
             ^

Dieser Link How to get ClassTag form TypeTag, or both at same time? nicht klar, was ich danach bin. Es sieht so aus, als würde man versuchen, einige Informationen über eine Klasse zu "filtern".

+0

Mögliches Duplikat von [Wie bekomme ich das ClassTag-Formular TypeTag oder beides gleichzeitig?] (Http://stackoverflow.com/questions/18729321/how-to-get-classtag-form-typetag-or-both- zur selben Zeit) – Kolmar

+0

Ich kann keine Antwort von dem bekommen, was Sie vorgeschlagen haben. – Randomize

Antwort

1

Lesen Sie die Fehler: mapTo funktioniert. Es ist toJson was nicht, und es sollte nicht: Sie können keine T mit einer TypeTag zu JSON konvertieren. Benötigen Sie nur, dass T auch eine JsonWriter haben muss: def foo[T: TypeTag: JsonWriter](value: Int) = .... Sie erhalten auch eine Future[String], keine String.

+0

danke. Dein Vorschlag hat funktioniert! Dies ist die letzte erforderliche Signatur: 'foo [T: TypeTag: JsonWriter] (Wert: Int) (implizites Tag: ClassTag [T]): StandardRoute' – Randomize

1

Wenn, was Sie brauchen, ist ein ClassTag dann warum nicht die Methode von foo ändern, um die ClassTag zu haben? Wie so:

def foo[T](value: Int)(implicit ev: ClassTag[T]): String ={ ... 

Das scheinen würde Ihr Grundbedürfnis erklären zu überzeugen, dass es ein ClassTag in implizitem Umfang vorhanden ist.

bearbeiten:

Was Sie zeigt, hat nichts mit ClassTag und alles zu tun, mit der Tatsache zu tun, dass es die implicits für eine JsonWriter oder JsonFormat fehlt. Vermutlich fehlt ein Import, um diese in den Geltungsbereich zu bringen.

+0

Ich habe es schon versucht, aber was passiere ich in 'bar [T]'? Das Kompilierproblem ist in 'bar'. – Randomize

+0

@Randomize also Sie sagen, dass 'val yo = etwas.bar [T]' nicht funktioniert? – wheaties

+0

ja. Ich habe der ersten Frage weitere Details hinzugefügt. – Randomize

Verwandte Themen