动态scala泛型是否可能?

时间:2017-03-15 22:07:40

标签: scala generics

我有一个返回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
...

1 个答案:

答案 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  => ...
}

当然,模式匹配可以以更细粒度的方式使用。希望有所帮助:)