2016-02-14 154 views
1

在通用功能的通用型的值進行比較下面的函數在斯卡拉

def compare[T] (o1:T, o2:T):Boolean = { 
    o1 > o2 
} 

不會編譯,因爲value > is not a member of type parameter T

定義參數要AnyVal類型也不起作用,而編譯器給出了類似的錯誤。

但是,該功能只能使用類型StringLong的值調用,它們支持>

寫這樣一個函數的recomended soultion是什麼?

感謝

回答

2

如果你想使用>運營商可以使用綁定觀點與Ordered[T]

def compare[T <% Ordered[T]] (o1:T, o2:T):Boolean = { 
    o1 > o2 
} 

有Scala的文檔很好的例子。

http://docs.scala-lang.org/tutorials/FAQ/context-and-view-bounds.html

,或者你可以用隱含參數事業視圖邊界現在就這樣做已被棄用:

def compare[T](o1: T, o2: T)(implicit ev: T => Ordered[T]): Boolean = { 
    o1 < o2 
} 
4

可以使用Ordering類型的類,像這樣:

def compare[T](o1: T, o2: T)(implicit ord: Ordering[T]) = ord.gt(o1, o2) 
1

如果您希望避免明確提及隱式參數,但也要避免使用現在不推薦使用的視圖邊界,您可以使用像這樣的上下文邊界來實現通過定義一個類型別名:

type OrderedView[T] = T => Ordered[T] 

def compare[T: OrderedView](o1: T, o2: T) = { 
    o1 > o2 
} 

這種模式似乎並不十分充分證明,遺憾的是 - 我發現它a post in the scala-internals mailing list試圖找出如何實現「豐富我的圖書館」模式,而不時使用上下文邊界。

0

視圖邊界已被棄用,您不應該使用它們,但可以使用上下文邊界。這會給你一個排序實例的隱式訪問,你可以用比較方法:如果你不得不這樣做了很多直接使用運營商是好得多,當然

def compare[T: Ordering] (o1:T, o2:T):Boolean = { 
    val ord = implicitly[Ordering[T]] 
    ord.compare(o1, o2) > 0 
} 

現在。訂購直接提供隱式轉換,您可以在本地導入:

def compare[T: Ordering] (o1:T, o2:T):Boolean = { 
    val ord = implicitly[Ordering[T]] 
    import ord.mkOrderingOps 
    o1 > o2 
}