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ür AnyRef oder Any).
  • 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 tun m("offset").parseInt.getOrElse(0).

InformationsquelleAutor vikraman | 2013-02-09
Schreibe einen Kommentar