首页 > 解决方案 > Arrays.deepToString 和 Scala 数组

问题描述

考虑代码:

val arr2d = Array(Array(1, 2, 3), Array(4, 5, 6))
util.Arrays.deepToString(arr2d)

它在第二行失败并出现以下错误:

错误:(79, 30) 类型不匹配;
found : Array[Array[Int]]
required: Array[Object] 注意:Array[Int] <: Object,但是类 Array 在类型 T 中是不变的。您可能希望研究通配符类型,例如_ <: Object. (SLS 3.2.10) util.Arrays.deepToString(arr2d)

它具有类型擦除的可能性,但我不确定如何使代码编译,尽管编译器试图提出解决方案。我更加困惑,因为类似的 Java 代码可以工作(即类似的东西Arrays.deepToString(new int[][] { { 1, 2, 3}, {4, 5, 6}}))。

代码中有什么问题,如何解决?

标签: arraysscala

解决方案


您可以使用模式匹配和递归编写自己的 deepToString:

def deepToString(array: Array[_]): String = array.map {
  case arr: Array[_] => deepToString(arr)
  case x => x.toString
}.mkString("[", ", ", "]")

val arr2d = Array(Array(1, 2, 3), Array(4, 5, 6))
val arr3d = Array(Array(Array(1,2,3), Array(4, 5, 6)), Array(Array(1,2,3), Array(4, 5, 6)))

deepToString(arr2d) // [[1, 2, 3], [4, 5, 6]]
deepToString(arr3d) // [[[1, 2, 3], [4, 5, 6]], [[1, 2, 3], [4, 5, 6]]]

只要 n 不足以导致堆栈溢出,这应该适用于 n 维数组。


推荐阅读