私はデータ構造を実装しており、ユーザーがそれをラップする適切なキータイプを提供する限り、キーとして任意のタイプを使用できるようにしたいと考えています。このキータイプには特徴があります。アイデアは、ベースからキータイプへの暗黙の変換を行い、逆に(事実上)ベースタイプのみを使用することです。特性は次のようになります。
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]
ですか?悲しいことに、コンパニオンオブジェクトは抽象的なメソッドを持つことができません。
これがうまくいくと仮定すると、企業全体が実現可能ですか、それとも、述べられているユースケースには複数の連鎖された暗黙の変換が必要ですか?(私が読んだように、Chainingは起こりません。)
補遺:上記の定義では、を使用してNode(key : K, ...)
(下のK <% Key[K]
)シーケンスを並べ替えることができますが、を使用することはできsortWith(_.key <= _.key)
ませんsortBy(_.key)
。したがって、明らかに、からK
への変換Key[K]
は、私がどこにも宣言したことがない場合でも、暗黙的に発生Ordering
しますが、暗黙的に使用できるものはありませんKey[K]
。ここで何が起こっているのですか?