在Scala中调用基于模板类型的方法
发布时间:2020-12-16 18:11:57 所属栏目:安全 来源:网络整理
导读:我正试图找出一种从 Scala调用 Java API的方法.基本上,有一个ContentValues对象有几个方法,如getAsString,getAsLong,每个方法都有自己不同的返回类型. 我可以将ContentValues包装在另一个对象中,以便我可以添加一个get [T]方法,该方法根据T调用正确的getAsXX
我正试图找出一种从
Scala调用
Java API的方法.基本上,有一个ContentValues对象有几个方法,如getAsString,getAsLong,每个方法都有自己不同的返回类型.
我可以将ContentValues包装在另一个对象中,以便我可以添加一个get [T]方法,该方法根据T调用正确的getAsXXX方法吗? 我尝试了什么(没有用,抱怨含糊不清的隐式解决方案): object SContentValuesConversions { case class SContentGetter[ScalaType](val check: String => Boolean,val getter: String => ScalaType) { def getTyped(key: String): Option[ScalaType] = { if (!check(key)) None else Some(getter(key)) } } implicit def SIntContentValues(cv: ContentValues) = SContentGetter((cv containsKey _),(cv getAsInteger _)) implicit def SLongContentValues(cv: ContentValues) = SContentGetter((cv containsKey _),(cv getAsLong _)) implicit def SStringContentValues(cv: ContentValues) = SContentGetter((cv containsKey _),(cv getAsString _)) } 解决方法
您可以使用与CanBuildFrom集合特征相同的技术.
我们首先创建一个Getter案例类 case class Getter[T](getter: (ContentValues,String) => T) { def getOpt(contentValues: ContentValues,key: String): Option[T] = if (contentValues containsKey key) Some(getter(contentValues,key)) else None } 这允许我们创建具有所需方法的ContentValues包装器. implicit class ContentValuesWrapper(val c: ContentValues) extends AnyVal { def getAsOpt[T](key: String)(implicit getter: Getter[T]) = getter.getOpt(c,key) } 现在,为了在ContentValues上调用getAsOpt方法,我们需要为正确的类型提供Getter的隐式实例. object Getter { implicit val intGetter = Getter(_ getAsInteger _) implicit val longGetter = Getter(_ getAsLong _) implicit val stringGetter = Getter(_ getAsString _) } 现在,您可以在ContentValues实例上使用getAsOpt方法. // fake version of ContentValues val c = new ContentValues { val m = Map("a" -> "1","b" -> "2","c" -> "3") def getAsInteger(k: String): Int = getAsString(k).toInt def getAsLong(k: String): Long = getAsString(k).toLong def getAsString(k: String): String = m(k) def containsKey(k: String): Boolean = m contains k } c.getAsOpt[Int]("a") //Option[Int] = Some(1) c.getAsOpt[Long]("b") //Option[Long] = Some(2) c.getAsOpt[String]("c") //Option[String] = Some(3) c.getAsOpt[Int]("d") //Option[Int] = None c.getAsOpt[Long]("e") //Option[Long] = None c.getAsOpt[String]("f") //Option[String] = None (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |