我有一个返回Object类型包装对象的方法,该对象最初是String,Int,Long,Boolean等
我还有一组重载方法,这些方法是为每个单独的类而不是Object类型
定制的我的目标是构建一个通用实现,它将检查输入为Object的对象,并将显式地将其强制转换为适当的底层类,以特定的预定顺序检查给定的一组类类型。第一个匹配类将保证方法调用,并将对象强制转换为特定的基础类。
这是我想要实现的基于复制/粘贴的代码示例,但希望它在循环或其他设备中表示,其中从List或其他收集设备检查类型,以便此列表可以被定义一次,并在许多情况下与模式匹配使用:
val o : Object = "string"
if (o.isInstanceOf[String] ) f(o.asInstanceOf[String] ) else
if (o.isInstanceOf[Boolean]) f(o.asInstanceOf[Boolean]) else
if (o.isInstanceOf[Int] ) f(o.asInstanceOf[Int] ) else
if (o.isInstanceOf[Double] ) f(o.asInstanceOf[Double] )
我想要什么(并注意,以下显然不是scala,但是...也许有一种方法如何在scala中表达类似的模式)
val o : Object = "string"
val t = List(String,Boolean,Int,Double)
for (T <- t) if(o.isInstanceOf[T]) f(o.asInstanceOf[T])
非常感谢任何帮助
这是一个更具体的例子:
val n : org.neo4j.graphdb.Node = ...
var j : com.fasterxml.jackson.databind.node.ObjectNode = ...
val p = "someProperty"
val o = n.getProperty(p) // returns Object (do not confuse w ObjectNode)
if (o.isInstanceOf[String ]) j.put(p,o.asInstanceOf[String ]) else
if (o.isInstanceOf[Boolean]) j.put(p,o.asInstanceOf[Boolean]) else
if (o.isInstanceOf[Int] ) j.put(p,o.asInstanceOf[Int] ) else
...
答案 0 :(得分:2)
如果我理解正确,我认为你要找的是模式匹配:
val object: Any = "string"
object match {
case o: String => // do some string operation on `o`
case o: Boolean => // do some boolean operation on `o`
case o: Int => ...
case o: Double => ...
}
当然,模式匹配可以以更细粒度的方式使用。希望有所帮助:)