this questionで作業しているうちに、次の問題が発生しました。コレクションは要素型に対して暗黙的な変換をどのように使用できますか?
def foo[T <: Ordered[T]](s : Seq[T]) = s.sorted
def foo[T <% Ordered[T]](s : Seq[T]) = s.sorted
最初のコンパイルは2番目のコンパイルではありません。コンパイラは、アサートされた暗黙の変換を使用してOrdering
を取得できることを理解していません。我々は少しを助けている場合、それは動作します:匿名関数をコンパイルするコンパイラがメソッド<=
を見つけるための暗黙的な変換が適用されるが
def foo[T <% Ordered[T]](s : Seq[T]) = s.sortWith(_<=_)
、すべてが正常です。
私は別の例はありませんが、要素が特定のプロパティを持つことを必要とするコレクション上の他の関数で同様の問題が起きると考えられます(変換によってのみアサートできる場合)。
コンパイラがこのように制限されている特別な理由はありますか?このような問題を解決する一般的な方法はありませんか? (ここでは簡単です)回避策はありますか? Key[T]
のプロパティをT
に変換する別の暗黙の変換?
(最後の考えは、T
の具体的な値がプロパティを持つことになり、あいまいな状況になる場合は問題があることに注意してください)。
2.8.1-finalのための有効なソリューションです。ありがとうございます。私は、シナリオごとに特別な要素プロパティ(ここでは 'Ordering')を記述する特殊な型を持たなければならないとすれば、一般的な方法はないと思いますか? – Raphael
このように定義された順序付けは 'T <:Ordered [T]'の場合でも使用されることに注意してください。明らかに、暗示は静的に解決されます。 – Raphael