加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 由Ordering [T]限定的类型参数T

发布时间:2020-12-16 18:16:06 所属栏目:安全 来源:网络整理
导读:在实现可排序的数据结构时,我正在考虑做这样的事情: trait MaxHeap[T : Ordering[T]] { def insert(e: T): Unit ...} 但这对MaxHeap [Int]等类型不起作用.在标准集合库中,集合的元素类型T不受限制.相反,为需要将T转换为Ordering [T]的方法提供隐式,例如, tr
在实现可排序的数据结构时,我正在考虑做这样的事情:

trait MaxHeap[T <: Ordering[T]] {
    def insert(e: T): Unit
    ...
}

但这对MaxHeap [Int]等类型不起作用.在标准集合库中,集合的元素类型T不受限制.相反,为需要将T转换为Ordering [T]的方法提供隐式,例如,

trait Seq[+A] extends ... {
    // it's Ordering[B],not Ordering[A],but the idea is the same.
    def max[B >: A](implicit cmp: Ordering[B]): A
}

我的问题是,如果我的类/特性中有很多方法涉及比较,有没有办法指定类/特征的元素类型是可比较的,这样我就不需要声明这些方法的含义?

解决方法

您可以声明一个定义排序的隐式参数,然后您可以在所有方法中使用它:

class MaxHeap[T](implicit cmp: Ordering[_ >: T]) ...

如果它是一个特征,它不能获取参数,但您可以将其声明为隐式值:

trait Heap[T] {
  implicit protected val cmp: Ordering[_ >: T];
  // ... use cmp in your methods ...
}

然后使用它的每个类都可以采用一个覆盖它的隐式参数:

class MaxHeap[T](implicit override protected val cmp: Ordering[_ >: T])
  extends Heap[T]
{
  // ...
}

更新:对于某些technical reasons订购不是逆变.这就是我使用Ordering [_>:T]的原因,因为它允许更大的灵活性.您可以使用为超类T定义的排序.您当然可以只使用cmp:Ordering [T],但是你不能做类似的事情

new MaxHeap[java.lang.Integer]()(new Ordering[java.lang.Number] {
    // ...
  });

另外,Ordering的整个想法是你不必对T施加任何约束.这更灵活,除了其他方面允许对同一个类进行不同的比较.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读