使用替代方法重载方法值toString

时间:2013-06-25 15:38:53

标签: java scala

Java代码

String method1(Object obj) {
  if (obj == null) {
    return "null";
  } else if (obj instanceof MyClass123[]) {
    return method2(ob)).toString();
  } else if (obj instanceof int[]) {
    return Arrays.toString((int[]) obj);
  } else if // and so for double, float, boolean, long, short...

  } else if (obj instanceof Object[]) {
    return Arrays.deepToString((Object[]) obj);
  } else {
    return obj.toString();
  }
}

我尝试在Scala中做同样的事情

def method1(obj: Any): String = obj match {
    case null => "null"
    case x: Array[MyClass123] => method2(x).toString
    case x: Array[AnyRef] => Arrays.deepToString(x)
    case x: Array[_] => Arrays.toString(x)
  }

最后一行导致错误

overloaded method value toString with alternatives:
[error]   (Array[java.lang.Object])java.lang.String <and>
[error]   (Array[Double])java.lang.String <and>
[error]   (Array[Float])java.lang.String <and>
[error]   (Array[Boolean])java.lang.String <and>
[error]   (Array[Byte])java.lang.String <and>
[error]   (Array[Char])java.lang.String <and>
[error]   (Array[Short])java.lang.String <and>
[error]   (Array[Int])java.lang.String <and>
[error]   (Array[Long])java.lang.String
[error]  cannot be applied to (Array[_])
[error]     case x: Array[_] => Arrays.toString(x)

1 个答案:

答案 0 :(得分:1)

你得到的错误始于java.util.Arrays有许多不同的'toString'方法,而scala编译器不知道选择哪一个。

但真正的问题是_可以匹配任何类型,包括Any,我们没有toString的版本可以与Any一起使用 - 实际上是最常见的版本我们有AnyRefObject,您在之前的案例中已经匹配。虽然为toString的许多子类型定义了AnyVal,但未定义Unit

您真正想要使用的是mkString方法,即

def method1(obj: Any): String = obj match {
    case null => "null"
    case x: Array[AnyRef] => Arrays.deepToString(x)
    case x: Array[AnyVal] => x.mkString("[",",","]")
    case _ => obj.toString
  }