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するバージョンがありません。実際、最も一般的なバージョンはie用であり、前のケースで既に一致しています。多くのサブタイプに対して定義されていますが、定義されていませんtoStringAnyAnyRefObjecttoStringAnyValUnit

あなたが本当に使いたいのは、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 に答える