scala将Array [Product]转换为Array [MyType]

时间:2018-06-21 09:29:22

标签: arrays scala type-conversion

我有自己的课程:

case class QueueObject[K, V](priority: K, e: V)(implicit prior: K => Ordered[K]) {
  require(e != null, "Can't put null element in queue. Please put another type of data!")
  type PQObject = QueueObject[K, V]

  def eq(other: PQObject): Int = if (priority >= other.priority) 1 else -1
}

在其他班级我有

case class QueueClass[K, V](container: Array[QueueObject[K, V]]) {
...
type PQObject = QueueObject[K, V]
type PQContainer = Array[PQObject]
val array: PQContainer = container
...

所以我尝试像这样更新我的数组:

def deleteElement(array: PQContainer):PQContainer = array.updated(0, array.lastOption).init

但是此函数的结果是 Array [具有可序列化的产品] ,因此我需要 Array [PQObject] >。 如何将结果类型转换为自己的结果类型? (我是Scala的新手,所以请不要发火)

2 个答案:

答案 0 :(得分:2)

问题是您正尝试将第一个元素替换为lastOption

lastOption的类型为Option[PQObject],scala编译器将PQObjectOption[PQObject]的公共超类型推断为Product with Serializable,这是一个非常通用(无用)类型。

尝试一下:

array.lastOption.foreach(array.update(0, _))
array.init

编辑

由于init在数组为空时会引发异常,因此您最好只使用last而不是lastOption

答案 1 :(得分:0)

问题出在array.lastOption上。调用的结果返回一个Option [PQOBject],Scala编译器检测到您的数组不是由相同类型的元素构建的,因此,编译器返回Product with Serializable。如果使用last代替lastOption,它将编译:

object testN1 {
  case class QueueObject[K, V](priority: K, e: V)(implicit prior: K => Ordered[K]) {
    require(e != null, "Can't put null element in queue. Please put another type of data!")
    type PQObject = QueueObject[K, V]

    def eq(other: PQObject): Int = if (priority >= other.priority) 1 else -1
  }

  case class QueueClass[K, V](container: Array[QueueObject[K, V]]) {
    type PQObject = QueueObject[K, V]
    type PQContainer = Array[PQObject]
    val array: PQContainer = container

    def deleteElement(array: PQContainer):PQContainer = array.updated(0, array.last).init
  }


}