2013-07-11 3 views
5

При реализации Сортируемых структур данных, я думал сделать что-то вроде этого:параметр Типа T ограничен для заказа [T]

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 
} 

Моим вопрос, если есть много методов в моем классе/черте с участием сравнения, есть способ определить тип элемента класса/черт, чтобы быть сопоставимы с тем, что мне не нужно объявлять implicits для тех, методы?

ответ

5

Вы могли бы объявить неявный параметр, определяющий порядок, а затем вы можете использовать его во всех своих методах:

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 reasonsOrdering не контравариантен. Вот почему я использовал Ordering[_ >: T], потому что он обеспечивает большую гибкость. Вы можете использовать порядок, определенный для суперкласса T. Конечно, Вы можете использовать только cmp: Ordering[T], но тогда вы не можете сделать что-то вроде

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

Кроме того, вся идея Ordering в том, что вам не придется вводить какие-либо ограничения на T. Это более гибко, и, кроме всего прочего, позволяет иметь разные сравнения для одного и того же класса.

+0

Спасибо @Petr. Но этот способ 'T' не применяется, чтобы быть сопоставимым, как если бы он был ограничен в списке параметров типа. Любой 'T' будет делать, если дано неявное. – cfchou

+0

'Заказ [_>: T]' это техника, которую я раньше не видел. Но мне интересно, почему бы не использовать 'Ordering [T]'. Удобные операторы, такие как '>', косвенно предоставленные 'Ordering.Implicits', похоже, не работают с' Ordering [_>: T] '. – cfchou

+0

@cfchou Я обновляю ответ, чтобы ответить на ваши комментарии. –

Смежные вопросы