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施加任何约束.这更灵活,除了其他方面允许对同一个类进行不同的比较. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |