0

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)
4

1 回答 1

1

您遇到的错误始于java.util.Arrays具有许多不同的“toString”方法的事实,而 scala 编译器不知道该选择哪一个。

但真正的问题是 _ 可以匹配任何类型,包括Any并且我们没有可以使用的版本toString-Any事实上,我们拥有的最通用的版本是AnyRefie Object,您已经在前面的案例中匹配了它。虽然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
  }
于 2013-06-25T16:24:25.670 回答