Scala匹配String和Array

时间:2016-11-08 08:18:32

标签: arrays string scala match

我试图在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]

有没有这样做?

1 个答案:

答案 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)
  }
}