gpt4 book ai didi

java - 在 Scala 中创建具有任意类型和映射的三维数组

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:07:49 25 4
gpt4 key购买 nike

当我们在 Scala 中有一个任意类型的 X 数组时,我们尝试使用 map 对其每个值进行双重嵌套(即,将 [1,2,3][[[1]],[[2]],[[3]]]), 我们得到一个 java.lang .ArrayStoreException。下面的代码是一个最小的失败示例:

import scala.reflect.ClassTag

def doubleNest[X: ClassTag](values: Array[X]): Array[Array[Array[X]]] = {
values map { value =>
Array(Array(value))
}
}

doubleNest(Array(1,2,3))

此外,将 [[1],[2],[3]] 转换为 [[[1]],[[2]] 时似乎会出现错误, [[3]]]。下面的代码是一个最小的失败示例(错误发生在第二个 map 中):

import scala.reflect.ClassTag

def doubleNest[X: ClassTag](array: Array[X]): Array[Array[Array[X]]] = {
val nested = array map { value =>
Array(value)
}

nested map { arr =>
Array(arr)
}
}

doubleNest(Array(1,2,3))

为什么会这样?

最佳答案

似乎Scala 不喜欢直接制作嵌套的泛型数组。即使这样也失败了:

def foo[T: ClassTag](t: T) = Array(Array(t))
foo(1) // java.lang.ClassCastException: java.base/[Ljava.lang.Object; cannot be cast to [[I

(在这种情况下,可能是因为 ClassTag 查看被删除的类,所以 Array.apply 做了同样的事情,它创建了一个 Array[Array [Object]] 而不是 Array[Array[T]]。)

ClassTag 似乎也有方法 wrapnewArray以此目的。所以,你可以使用一些涉及 implicitly[ClassTag[X]].wrap.wrap.newArray(array.length) 的丑陋来完成工作,或者你可以这样做,这似乎可以通过从不直接要求它创建嵌套数组:

import scala.reflect.ClassTag

def nest[C: ClassTag](arr: Array[C]) = arr.map(Array(_))

def doubleNest[X: ClassTag](array: Array[X]): Array[Array[Array[X]]] =
nest(nest(array))

关于java - 在 Scala 中创建具有任意类型和映射的三维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51925421/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com