2013-07-11 25 views
5

, ben böyle bir şey yaptığını düşünüyordum. Standart koleksiyon kitaplığında, bir koleksiyonun T öğesi sınırlı değildir. Bunun yerine, T'yi Siparişe [T], ör.Tipi parametresi T [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 
} 

Sorum karşılaştırma kapsayan benim sınıf/özellikte birçok yöntem vardır, eğer ben olanlar için implicits ilan etmeye gerek yok ki karşılaştırılabilir olması sınıf/özellik en eleman türünü belirtmek için bir yol var olduğu yöntemler?

cevap

5

Sen sipariş tanımlayan örtülü bir parametre olduğuna dair karar ve sonra tüm yöntemlerde kullanabilirsiniz:

class MaxHeap[T](implicit cmp: Ordering[_ >: T]) ... 
bir özellik ise

, bir parametre alamaz, ancak

0123: onu geçersiz kılan örtülü bir parametre alabilir kullanan

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

ve sonra her sınıf: bir örtülü bir değer olarak ilan edebilir

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

Güncelleme: Bazı technical reasonsOrdering için kontravaryant değildir. Bu yüzden daha fazla esneklik sağladığından Ordering[_ >: T]'u kullandım. T'un bir üst sınıfı için tanımlanan bir siparişi kullanabilirsiniz. Ayrıca Ordering bütün fikir T herhangi kısıtlamalar getirmek zorunda kalmamasıdır Elbette sadece cmp: Ordering[T] kullanabilirsiniz, ancak o zaman

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

gibi şeyler yapamaz. Bu daha esnektir ve diğer şeylerin yanı sıra aynı sınıf için farklı karşılaştırmalar yapılmasına izin verir.

+0

Teşekkür ederiz @Petr. Fakat bu şekilde 'T', tür parametre listesinde sınırlandırılmış gibi karşılaştırılmaya zorlanmaz. Herhangi bir “T”, bir zımni verildiği sürece yapılacaktır. – cfchou

+0

'Sipariş [_>: T]' daha önce görmediğim bir tekniktir. Ama merak ediyorum neden 'Sipariş [T]' kullanma. Dolaylı olarak "Ordering.Implicits" tarafından sağlanan ">" gibi kullanışlı işleçler "Sipariş [_>: T]" ile çalışmıyor gibi görünmektedir. – cfchou

+0

@cfchou Cevabınızı yorumlarınızı yanıtlamak için güncelliyorum. –