我在Scala中编写了一些代码,这些代码依赖于我在参数上看不到的类型参数。
def read[T](json: String)(implicit m: Manifest[T]): T = {
if (m <:< manifest[Map[String, Any]]) {
JsonParser.jsonToMap(json).asInstanceOf[T]
} else {
throw new UnsupportedOperationException("Not implemented for type %s".format(m))
}
}
除了我正在编写自己的json框架之外,这可能是一个非常糟糕的主意......
我可以使用case语句而不是if语句,还是应该考虑另一个方向?
答案 0 :(得分:6)
在这样的情况下,如果你觉得想要对清单或类使用测试序列(或更普遍地输入套管),那么更好的想法是使用类型类。在这种特殊情况下,它看起来像,
// Type class
trait JsonReader[T] {
def apply(json : String) : T
}
// Type class instance for type Map[String, Any]
implicit def mapReader = new JSonReader[Map[String, Any]] {
def apply(json : String) =
JsonParser.jsonToMap(json).asInstanceOf[Map[String, Any]]
}
def read[T](json : String)(implicit reader : JsonReader[T]) : T = reader(json)
您应该为您关注的所有类型添加类型实例。
您现在可以按如下方式调用您的读取功能,
read[Map[String, Any]](... some json ...)
注意,现在如果您尝试使用与未提供类型类实例的类型对应的类型参数调用它,结果将在编译时出错,而不是在运行时UnsupportedOperationException