将数组[AnyVal]转换为基元数组[T],T在scala中可以是Int、Double等
我了解到在scala将数组[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 =>
中,数组
不是一个协变集合。如果我有一个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
}
}