Casting-String zu Int mit scala-Abzieher
Ich versuche zu werfen String
zu Int
mit Abzieher. Mein code sieht wie folgt aus.
object Apply {
def unapply(s: String): Option[Int] = try {
Some(s.toInt)
} catch {
case _: java.lang.Exception => None
}
}
object App {
def toT[T](s: AnyRef): Option[T] = s match {
case v: T => Some(v)
case _ => None
}
def foo(param: String): Int = {
//reads a Map[String,String] m at runtime
toT[Int](m("offset")).getOrElse(0)
}
}
Bekomme ich ein runtime error: java.lang.String cannot be cast to java.lang.Integer
. Es scheint, die Dunstabzugshaube ist nicht überhaupt verwendet. Was soll ich tun?
Edit: Mein Anwendungsfall ist wie folgt. Ich bin mit spielen, und ich will der parse den query-string an die url übergeben. Ich möchte die query-string-Wert (Zeichenfolge) und verwenden Sie es als ein Int, Double etc. Zum Beispiel,
val offset = getQueryStringAs[Int]("offset").getOrElse(0)
- Warum erwarten Sie es verwendet werden?
- Sie hat die Frage mit "implizite Konvertierung", es gibt keine implizite Konvertierung gehen auf Ihrem code.
toT[T] ... case v:T
funktioniert nicht, T ist verloren, in die Löschung.- Es ist grundsätzlich unmöglich, cast ein
String
zu einer anderen Art (außer fürAnyRef
oderAny
). - Oh, ich habe versucht, eine implizite def aber das hat nicht funktioniert.
- Ich habe meine use-case.
- Wenn Sie spielen 2.1.0 (mit scala 2.10) können Sie festlegen, "extension" Methoden" auf
String
:implicit class StringConversionOps(val str: String) extends AnyVal { def parseInt = try { Some(str.toInt) } catch { case _ => None } }
. Können Sie Methoden hinzufügen, dass die Klasse als notwendig. Dann, vorausgesetzt es ist in Reichweite können Sie tunm("offset").parseInt.getOrElse(0)
.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich denke, das größte problem hier ist, dass Sie scheinen zu verwechseln, casting und Konvertierung. Sie haben eine
Map[String, String]
und daher Sie kann nicht wirken, die Werte zuInt
. Sie haben zu konvertieren. Zum Glück Scala fügt dietoInt
- Methode, um Zeichenfolgen durch implizite Konvertierung zu StringOps.Sollte diese Arbeit für Sie:
Beachten Sie, dass
toInt
werfen wirdjava.lang.NumberFormatException
wenn die Zeichenfolge kann nicht konvertiert werden zu einem integer.Bearbeiten:
Was Sie wollen, werden afaik nur die Arbeit mit typeclasses.
Hier ist ein Beispiel:
Verwendung:
T
gelöscht wird und nicht zur Laufzeit verfügbar (dies kann tatsächlich behoben werden mitManifest
/TypeTag
, aber noch immer haben Sie Zeichenfolgen, die Sie haben zu konvertieren).StringConverter[T]
. Versuchendef foo[A : StringConverter]
ist, so nennt man eine Art gebunden und fügt einen impliziten Parameter vom TypStringConverter[A]
zu deiner Methode, die dann für den AufruftoT[A]
.Gibt es ein problem in Ihrem code, für die Sie erhalten haben sollten compiler-Warnungen:
Nun... wo soll
Apply
verwendet wurden? Ich sehe es erklärt, aber ich sehe es nicht überall eingesetzt.BEARBEITEN
Über die Warnung, Blick auf die Diskussionen rund um type erasure auf Stack Overflow. Zum Beispiel, diese Antwort schrieb ich auf, wie man sich es-obwohl es jetzt veraltet Scala 2.10.0.
Um Ihr problem zu lösen würde ich die Verwendung von type-classes. Zum Beispiel:
Dann Sie können schreiben Sie Ihre Methode so:
Im Einsatz: