将数组[AnyVal]转换为基元数组[T],T在scala中可以是Int、Double等

将数组[AnyVal]转换为基元数组[T],T在scala中可以是Int、Double等,scala,Scala,我了解到在scala中,数组不是一个协变集合。如果我有一个AnyVal数组,并且数组中的所有元素都具有相同的类型,那么如何将其设置为一个基元数组 我认为应该使用数组的第一个元素来检测数据类型。如下面的代码所示: def convert(arr:Array[AnyVal]):Array[_] = { val firstElement = arr.head firstElement match { case y:Int => ??? case y:Long =>

我了解到在scala
中,数组
不是一个协变集合。如果我有一个
AnyVal
数组,并且数组中的所有元素都具有相同的类型,那么如何将其设置为一个基元数组

我认为应该使用数组的第一个元素来检测数据类型。如下面的代码所示:

def convert(arr:Array[AnyVal]):Array[_] = {
  val firstElement = arr.head
  firstElement match {
    case y:Int => ???
    case y:Long => ???
    case y:Float => ???
    case y:Double => ???
     ... 
  }
}

函数的返回类型在编译时定义。不能根据传递给函数的数据更改函数的返回类型

值的类型也在编译时创建时定义。但是,该值可以保存在值类型的任何超类型的变量中,这就是使类型系统如此强大的原因。Scala还可以通过模式匹配轻松地判断值的实际类型

如果在编译时知道所需的类型,请使用
collect
使用模式匹配缩小值的类型。例如,要从
AnyVal
列表中获取
Double
列表,请执行以下操作:

val doubles: List[Double] = anyList.collect{ case d: Double => d }
任何非双值都将被丢弃


还要注意的是,
Array
是一个Java遗留问题,所以更喜欢像
List
Vector
这样的Scala类型,我不确定这是否是一个最佳的解决方案(或者考虑到这一点,将任何VAL输入转换为原语)。但是,将所有元素类型转换为所需类型应该是可行的。这是我刚刚试过的一个片段

  def convert(ar: Array[AnyVal]): Array[_] = {
    ar.head match {
      case y: Int => ar.map(_.asInstanceOf[Int])
      case y: Long => ar.map(_.asInstanceOf[Long])
      case _ => Array() // do check if this can be the case
    }
  }