我试图在String / Array对象上调用方法foldLeft。类似的东西:
def doSth(obj: Any): Int = {
obj match {
case t: TraversableOnce[Any] => t.foldLeft(0)((rs: Int, i: Any) => ...)
case other => ...
}
}
但是当我致电doSth("abc")
时,它与case other
匹配。我想要的是case t: TraversableOnce[Any]
。
有没有这样做?
答案 0 :(得分:4)
String不是TraversableOnce的子类型。这就是它与TraversableOnce不匹配的原因。
虽然String可以隐式转换为StringOps,它是TraversableOnce的子类型。检查Predef.augmentString
你可以这样做。在这种情况下,scala编译器将隐式地将String
转换为StringOps
。如果我们传入class scala.collection.immutable.StringOps
"hello"
def doSth(obj: TraversableOnce[Any]): Int = {
println(obj.getClass())
obj.foldLeft(0)((rs: Int, i: Any) => ...)
}
并在以下代码中。如果我们传入class java.lang.String
,它会打印出"hello"
。这意味着没有隐式转换。
def doSth(obj: Any): Int = {
obj match {
case t: TraversableOnce[Any] => t.foldLeft(0)((rs: Int, i: Any) => ...)
case other =>
println(other.getClass)
}
}