Given是一个Java方法,它java.lang.Object
为给定的字符串返回。我想将此方法包装在Scala方法中,该方法将返回的实例转换为某种类型T
。如果转换失败,则该方法应返回None
。我正在寻找类似的东西:
def convert[T](key: String): Option[T] = {
val obj = someJavaMethod(key)
// return Some(obj) if obj is of type T, otherwise None
}
convert[Int]("keyToSomeInt") // yields Some(1)
convert[String]("keyToSomeInt") // yields None
(如何)可以使用Scala的反射API来实现?我很清楚,convert
可能必须更改的签名。
那是ClassTag
如果的话:
import reflect.ClassTag
def convert[T : ClassTag](key: String): Option[T] = {
val ct = implicitly[ClassTag[T]]
someJavaMethod(key) match {
case ct(x) => Some(x)
case _ => None
}
}
它可以用作提取器,以同时测试并转换为正确的类型。
例子:
scala> def someJavaMethod(s: String): AnyRef = "e"
someJavaMethod: (s: String)AnyRef
[...]
scala> convert[Int]("key")
res4: Option[Int] = None
scala> convert[String]("key")
res5: Option[String] = Some(e)
编辑:注意然而,一个ClassTag
不不自动拆箱装箱元。因此,例如,convert[Int]("a")
它将永远无法工作,因为java方法返回AnyRef
,convert[java.lang.Integer]("a")
对于其他原始类型,它必须为,依此类推。
Miles的回答Typeable
似乎可以自动处理那些极端情况。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句