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)
答案 0 :(得分:1)
你得到的错误始于java.util.Arrays
有许多不同的'toString'方法,而scala编译器不知道选择哪一个。
但真正的问题是_可以匹配任何类型,包括Any
,我们没有toString
的版本可以与Any
一起使用 - 实际上是最常见的版本我们有AnyRef
即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
}