【问题标题】:Overloaded method value toString with alternatives使用替代方法重载方法值 toString
【发布时间】:2013-06-25 15:38:53
【问题描述】:

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)

【问题讨论】:

    标签: java scala


    【解决方案1】:

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

    但真正的问题是 _ 可以匹配包括Any 在内的任何类型,而且我们没有可以与Any 一起使用的toString 版本——事实上,我们拥有的最通用的版本是@987654326 @ 即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
      }
    

    【讨论】:

    • 这完全等同于 Java 代码吗?在 Java 中,deepToString 和 toString 分别用于引用类型和原始类型。
    • 不像 Java 代码那样完全递归,所以我编辑了代码以反映这一点。
    • 现在您的代码中有 2 个错误:一个 -- 更不准确,第二个 -- 无法编译。
    猜你喜欢
    • 2018-05-17
    • 1970-01-01
    • 1970-01-01
    • 2018-12-19
    • 1970-01-01
    • 2017-01-25
    • 2014-04-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多