ジェネリックインターフェースの制約について

ジェネリックインターフェースの制約について

この時点で、ジェネリックインターフェースの制約について議論する価値があります。ジェネリックコンテナ型のインターフェースを定義したい場合があるかもしれません。例えば、セットデータ構造を必要とするアルゴリズムがあるとします。異なるトレードオフを持つ多くの異なる種類のセット実装があります。必要なセット操作のインターフェースを定義することで、パッケージに柔軟性を追加し、特定のアプリケーションに適したトレードオフを決定することをユーザーに委ねることができます:

type Set[E any] interface {
    Insert(E)
    Delete(E)
    Has(E) bool
    All() iter.Seq[E]
}

ここで自然な質問は、このインターフェースの制約が何であるべきかということです。可能であれば、ジェネリックインターフェースの型パラメータは制約として any を使用し、任意の型を許可するべきです。

上記の議論から、理由は明らかであるべきです:異なる具象実装は異なる制約を必要とする可能性があります。これまで検討したすべての Tree 型、および OrderedSet 型は、これらの型が異なる制約を持っているにもかかわらず、要素型に対して Set を実装できます。

インターフェースを定義する目的は、実装をユーザーに委ねることです。ユーザーが実装でどのような制約を課したいかを予測できないため、具象実装ではなくインターフェースに(any より強い)制約を残さないようにしてください。