私はデータ構造を実装しており、適切なキータイプをラップする限り、どのタイプもキーとして使用できるようにしたいと考えています。私はこのキータイプの特性を持っています。この考え方は、基底型から基底型への暗黙的な変換を行うことで、もう1つの方法は基本型を(事実上)使用することです。特徴は次のようになります。一般的な形質の暗黙的な変換
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)
を使用しないことにより、(K <% Key[K]
下)Node(key : K, ...)
の順序を並べ替えることができます。だから明らかに、K
からKey[K]
への変換は暗黙のうちにどこからでも宣言されていますが、Ordering
はKey[K]
に暗黙的にはありません。ここで何が起こっているのですか?ここで
なぜ、注文ではなくオーダーを使用しますか? – Landei
タイプ*は*オーダーされていますが、*オーダーメントがあるためです。違いはありますか? Orderingを生成する汎用/抽象関数を実装するにはどうすればよいですか? – Raphael
私はおそらく 'foo'の暗黙的なパラメータがうまくいくので順序を渡すと思っていましたが、もちろんこれはビューバインドと競合します。 – Raphael