【发布时间】:2014-06-03 00:46:17
【问题描述】:
我正在尝试一种类型安全的方式来转换解析 JSON 字符串的结果。我想检查一个字段是 Map[String, any] 还是纯字符串。我的第一次尝试是
def test(x:Any) = {
x match {
case m:Map[String,Any] => ...
...
}
这会导致“类型模式 Map[String,Any] 中的非变量类型参数 String 未选中,因为它已被擦除消除”
翻阅 TypeTag 和 ClassTag 的文档,我找不到一个好的方法来完成它。以下代码不会导致警告,但我想知道它为什么会起作用。
type StringMap = Map[String,Any]
def test(x:Any) = {
x match {
case m:StringMap => ...
...
}
【问题讨论】:
-
编译器没有抱怨并不意味着第二种解决方案有效。使用任何一段代码,定义为
Map(1 -> 2)的 Map 都会遇到该匹配条件,即使这不是您想要的。 -
在一些非常低级的代码之外,使用
Any或Map[String, Any]的方法签名在精心设计的Scala 代码中几乎不存在。
标签: scala pattern-matching type-erasure