我有自己的课程:
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的新手,所以请不要发火)
答案 0 :(得分:2)
问题是您正尝试将第一个元素替换为lastOption
。
lastOption
的类型为Option[PQObject]
,scala编译器将PQObject
和Option[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
}
}