問題タブ [generic-variance]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
scala - 関数型間のサブタイプ
coursera 関数型プログラミングのコースで、私は微妙な概念に出くわしました。
A2 <: A1およびB1 <: B2の場合、(A1 => B1) <: (A2 => B2)
正当化
- A2 に引数を渡すと、サブタイプの関係により、同じ引数を A1 に渡すことができます。
- 次に、関数 A1 => B1 を適用します。
- 次に、その関数は B1 を返し、B2 として修飾されるサブタイプのため
これをベン図で描くと、
参考:Youtube動画
ありがとう
generics - Kotlin: ジェネリック型のサブクラスに関数を継承させ、利用可能な出力の型を制限する
Collections インターフェースまたは複数の要素を含むセットに似たものを実装する次の Kotlin クラスがあります。
したがって、MyCollection のサブクラスの 1 つのインスタンスは、ある種のセットを記述し、クラス Member< C > のインスタンスは、そのコレクションの特定のメンバーを記述します。サブクラス BigCollection と SmallCollection は、コレクションのサイズを決定します。私の考えは、コレクションを扱うのがどれほど難しいかに応じて、ここにさらに追加することです.
次の例を想像することができます
赤はタイプ Member< Color > のインスタンス/オブジェクトである可能性があります
Persons は、型 SmallCollection< Persons > のサブタイプである可能性があります
Color は、タイプ BigCollection< Color > のサブタイプであり、本質的に無限である可能性があります。これは、たとえば、関数 contains(Member< Color >) が false を返すことはできず、Unsure または True を返す可能性があることを意味し、特定のタイムアウト後に例外をスローします。
私がやろうとしていることの基本的な考えをあなたが持っているように。
コンパイル時と実行時の両方で型 MyCollection< C > にアクセスしたい場合、JVM の型消去によって再帰ジェネリックの使用が強制されることに注目してください。
かなり型安全であることがわかります。mapToOtherDomain が MyCollection< D > のサブタイプである E を返すことはわかっています。これは、入れた関数 (Member< C >) -> Member< E >) の E と同じタイプになります。
ここで、MyCollection のサブクラスが関数 mapToOtherCollection をオーバーライドして、サイズが関数の静的シグネチャに反映されるようにできれば、すばらしいことです。関数 f は 1 対 1 のマッピングであるため、タイプ A の smallCollection を BI にマッピングする場合、出力を B の smallCollection にする必要があります。
特にJavaではほとんど可能であり、KotlinはJavaのジェネリック型システムの拡張であると想定されているため、これは可能であるべきだと思います。私はそれを機能させることはできません。オーバーライドしたいが、戻り値の型 (したがって入力型も) を制限したい
私は次のようなメソッドシグネチャをいじりました:
これにより、前のメソッドをオーバーライドしないというコンパイラ エラーが発生し、次のようになります。
これは、 Type 引数が範囲外であることを示しています。
この例のジェネリック クラスのサブクラスによりよく一致するように、in/out 型を制限するにはどうすればよいですか? BigCollection 内の contains() の出力が、動的ではなく静的に Unsure になることをコンパイラが認識していれば、それも素晴らしいことです。
ありがとう
c# - 型のオブジェクトをジェネリック型に適合するオブジェクトに追加するための多目的なソリューション
インターフェイスの (反?) 分散が答えのように感じますが、適切な解決策が見つかりません。
これらのクラスを用意しましょう:
私の状況は:
次の 2 つのように、既に初期化されている Bananas と Apples のコレクションがあります (ただし、別のものを使用できます)。
/li>次の 2 つの写真のコレクションがあります。
/li>
今、私は非常に単純なことをしようとしていますが、用途の広い方法で、つまり、新しい果物が見つかり、新しい FruitPicture がコレクションに表示されるたびにコードを変更する必要があるスイッチ/if を避けたい =>.AddFruit()コレクションから適切な種類の FruitPicture に移動したいと考えています。ほとんどすべてのロジックを変更できますが、一般的な FruitPicture クラスは維持したいと考えています。
私が得た最も近いものは次のとおりです。
ありがとうございます。スキート (冗談; 一種の)

