【问题标题】:How to create an Array[Any] containing integer values in scala?如何在scala中创建一个包含整数值的Array[Any]?
【发布时间】:2025-12-29 02:40:06
【问题描述】:

更新: 我误解了一条错误消息,所以这个问题是无效的。

val inputIds = Array[Any](7, 1, 3)

足以在 Scala 中创建一个 Array[Any]。

============

我正在尝试创建一个数组,该数组需要传递给采用 Array[Any] 的方法,但值是数字。

起初我只是尝试了创建数组的常规方法:

val inputIds = Array(7, 1, 4)

并得到错误:

Type mismatch, expected: Array[Any], actual: Array[Int]

(来自 IntelliJ 编辑器,我想我没有检查它是否正确)

然后我尝试直接创建整数值,例如作者:

Integer.getInteger("7")

并将它们传递给 Array 构造函数,但我一直收到同样的错误。

现在我尝试了:

val inputIds: Array[Any] = Array[Any](7, 1, 4)

它给了我:

Type mismatch, expected: Array[Any], actual: Array[Array[Int]]

你可以说我有点闲,我想要的只是包装类型而不是原语!我猜 Scala 正在尝试优化数组以进行迭代,但我需要的只是一个小数组,我可以将其传递给 var args 以获取混合类型的数组。或者也许是创建该 vararg 方法的更好方法?现在它的类型是:

Array[Any]*

========

好的,所以我解决了我最初的问题(尽管在 cmets 中仍然存在关于我是否正确理解导致错误的原因的争议)。但是,它并没有解决我的问题,如下:

我正在尝试转置具有不同类型的数组数组(有些是嵌套的,但最终是 Double 或 Ints)并且无法弄清楚如何让 scala 类型系统来执行此操作。这是基本示例:

val integerArray = Array(7, 1, 4)
val nestedIntegerArray = Array(
  Array(6, 10, 60),
  Array(5, 89, 57),
  Array(15, 3, 5)
)
val nestedDoubleArray = Array(
  Array(.13, .9, .8),
  Array(.2, .777, .57),
  Array(.15, .3, .5)
)

val brokenComputation = typeErrorExample(integerArray, nestedIntegerArray, nestedDoubleArray)

被调用的方法在哪里:

  private def typeErrorExample(arrays: Array[_ <: Any]*)={
    val arrayDataFrame = Array(arrays).transpose
  }

这给出了错误:

No implicit view available from Seq[Array[_]] => Array[U].
[INFO]     val arrayDataFrame = Array(arrays).transpose

这样做的正确方法是什么?我应该改用非数组数据结构吗?

希望拥有更多代码也能帮助专家了解导致我最初错误的原因。 (inputIds 被重命名为 integerArray 以保持一致性)。

【问题讨论】:

  • val inputIds: Array[Any] = Array[Any](7, 1, 4) 适合我。你确定那是你尝试过的吗?
  • @JoePallas 是的,我复制粘贴了代码。刚刚尝试实际编译它,它给出了这个错误:[INFO] found : Array[Array[Int]] [INFO] required: Array[Any] [INFO] 注意:Array[Int] <: any array t>_ <: Any。 (SLS 3.2.10)
  • 问题很混乱。将Array[Any] 作为参数的方法将接受Array[Int] 而不会出错。
  • @jwvh 用更大的代码 sn-p 更新了我的问题,这可能会为您澄清一些事情。
  • 发布 minimal reproducible example of Array[Any](7, 1, 4) 失败,如果失败。

标签: scala


【解决方案1】:

显式转换并不理想,但应该可以解决问题。

 Array(1, 2, 3).asInstanceOf[Array[Any]]

【讨论】:

    【解决方案2】:

    @Adair,这似乎将输入数组排列成您正在寻找的 Array[Array[Any]] 类型。

    def transpose(arrays: Array[_]*) :Array[Array[_]] =
      arrays.indices.map(x => arrays.map(_(x)).toArray).toArray
    

    现在有一个建议:不要这样做

    • 不安全。如果传递的数组数量超过每个数组的维度,这将引发异常。
    • 键入Any 不是您想要的。当数据元素变成Any 类型时,您就丢失了类型信息,想要找回它是一件非常痛苦的事情。

    【讨论】:

      【解决方案3】:

      Jason 的回答有效,所以当我在 intelliJ 之外运行它并更改方法签名中的数据类型时,按照编译器错误的建议进行操作:

      arrays: Array[_ <: Any]*
      

      【讨论】:

        【解决方案4】:
        scala> Array(1, 2, 3).map(_.asInstanceOf[Any])
        res6: Array[Any] = Array(1, 2, 3)
        

        【讨论】:

          【解决方案5】:

          有很多正确的答案。但是为什么甚至需要做asInstanceOf。你可以轻松做到。

          scala> val arr: Array[Any] = Array(1,2,3)
          arr: Array[Any] = Array(1, 2, 3)
          

          简单,工作完成。

          【讨论】: