【发布时间】:2018-06-21 09:29:22
【问题描述】:
我有自己的班级:
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[Product with Serializable],所以我需要Array[PQObject]。 如何将结果类型转换为我自己的? (我是 Scala 的新手,所以请不要发火)
【问题讨论】:
-
K => Ordered[K]应该是Ordering[K],它应该附加到QueueClass,而不是QueueObject。如果队列中的每个对象都有自己的关于如何比较优先级的想法,那是没有任何意义的。 -
它会是什么样子? 案例类QueueObject[K : Ordering[K], V](priority: K, e: V) 像这样?
-
而不是
K: Ordering(没有[K])。但它本质上只是你现在拥有的语法糖(每个QueueObject都有自己的Ordering)。我宁愿声明QueueClass[K: Ordering, V],然后将排序作为隐式参数添加到实际需要它的QueueObject的方法中。实际上,我可能会尝试使QueueObject成为QueueClass中的内部类。此外,我不会覆盖eq,因为eq是检查引用相等性的方法,应该返回Boolean。 -
@AndreyTyukin 对不起,但我又遇到了问题。如果我这样做: case class QueueObject[K: Ordering, V](priority: K, e: V) { 我不能在我的新文件中使用 >=等于 override def equals(obj: PQObject): Boolean = if (this.priority >= obj.priority) true else false
-
IIRC,
val ord = implicitly[Ordering[K]]; import ord._之类的东西应该可以解决问题。但是你可以直接传递implicit ord: Ordering[K]。切换到K: Ordering而不是implicit ord: Ordering[K]不是我的意思。我的观点是,如果每个条目(K, V)都有自己的顺序,那没有任何意义。顺便说一句:你的equals甚至不是对称的。
标签: arrays scala type-conversion