レッツ・コール(A1 => B1)別のファンクションF2のサブタイプにするには、F2の代わりにタイプシステムを受け入れる必要があります。
引数Aの任意のサブタイプを、Aを受け取り、スーパータイプを受け入れない関数に渡すことができます。これは、F1がF2のサブタイプであるためには、少なくともF2が引数として受け入れるすべてを受け入れる必要があることを意味します。したがって、A1はA2のスーパータイプでなければなりません。
一方、F1の出力は、少なくともF2の出力と同じくらい詳細でなければならないので、F2の出力を使用できる場所であればどこでも使用できます。つまり、B1はB2のサブタイプでなければなりません。
私はこの図がどのように一緒に収まるかを視覚化するのに良い方法だとは思っていませんが、2つのうち、図1が最も正確です。
は例を見てみましょう: は、あなたがそれをf1の代わりに使用することができるので、その後f2(s: Iterable): SortedSet
は、f1のサブタイプである機能f1(s: Set): Set
を持っていると言います。
f1の引数のタイプは、Set
またはSet
のサブタイプです。これらの引数はすべてf2でも有効です。 f1の出力はSet
なので、f2の出力はSet
として使用可能でなければなりません。 SortedSet
はSet
のサブタイプであるため、これも該当します。