我正在實現一個數據結構,並希望用戶能夠使用任何類型作爲密鑰,只要他提供一個合適的密鑰類型包裝它。我有這個關鍵類型的特點。這個想法是從基礎到鍵類型進行隱式轉換,另一種方式是(實際上)只使用基類型。這種特點如下:通用特質的隱式轉換
trait Key[T] extends Ordered[Key[T]] {
def toBase : T
// Further stuff needed for datastructure...
}
object Key {
implicit def key2base[T](k : Key[T]) : T = k.toBase
}
呼叫站點代碼看起來是這樣的:
def foo[K <% Key[K]](bar : Seq[K]) = bar.sorted(0)
計劃是K
類型的值應該被隱式轉換爲被責令Key[K]
或順序上Key[K]
應分別使用,所以一切都應該解決。當然,在特徵本身中沒有辦法實現隱含的base2key
。或者在那裏,也許使用隱式傳遞的類清單?考慮到這一點我找不到任何參考。
是否有可能以某種方式靜態斷言延伸Key[T]
的任何類型將帶有隱式轉換T => Key[T]
?可悲的是,伴侶對象不能有抽象方法。
假設這個解決方案,是整個企業可行還是將規定的用例需要多重鏈式隱式轉換,無論如何呢? (鏈接不會發生,因爲我已閱讀。)
附錄:有了上面的定義,我可以用sortWith(_.key <= _.key)
,但沒有使用sortBy(_.key)
排序Node(key : K, ...)
(下K <% Key[K]
)的序列。因此,顯然,從K
到Key[K]
的轉換隱含發生,即使它從未在我的任何地方聲明過,但在Key[K]
上沒有隱含可用的Ordering
。這裏發生了什麼?
爲什麼使用Ordered而不是Ordering? – Landei 2011-01-28 14:37:00
由於類型*是*排序的,但*具有*排序。它會有所作爲嗎?我如何實現一個產生排序的泛型/抽象函數? – Raphael 2011-01-28 14:44:31
我想可能會傳遞順序作爲`foo`的隱式參數會起作用,但當然這與視圖綁定衝突。 – Raphael 2011-01-28 14:54:44