【发布时间】:2017-10-14 12:05:21
【问题描述】:
我有以下代码
def function1(obj:Any)={
obj match {
case l:List[Map[String,Any]]=> {
println("ListMap" + l.toString())
}
case l:List[String]=> {
println ("list String" + l)
}
case None =>
}
}
当我将地图列表和字符串传递给此函数时,它只会打印第一个 case 语句,而不会打印第二个。有什么我做错了吗?
【问题讨论】:
-
为什么会转到第二个?这是使用
Anybtw 的可怕代码,使用这样的类型系统毫无意义。 case 语句的重点是每个 case 评估一次,以匹配给定的条件。 -
你应该会得到一个关于类型擦除的警告——第二种情况永远不会匹配。一般来说,您不能依赖于通过
x : A[Type]对模式中的泛型代码进行类型检查,而只能依赖于真正的类型匹配器(即具有 unapply 方法的对象)。 -
我必须使用 Any 因为我的数据是这样的......我别无选择
-
您也可以将函数设为通用:
def f[T](obj : T) = obj match { case Nil => ... ; case x::xs => ...。如果你需要处理obj,你可以传递一个T => ResultType类型的附加参数。 -
这是不可能的,因为类型擦除 (docs.oracle.com/javase/tutorial/java/generics/erasure.html)。无法在运行时检测泛型类型的类型参数。
标签: scala pattern-matching type-erasure