問題タブ [covariance]
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.
generics - C#3.0でジェネリック型の共分散を実現する方法はありますか?
これはC#4.0で導入されましたが、C#3.0でこれを実現する方法はありますか?
たとえば、次のコードについて考えてみます。
User<T>
ここで、を保存できるUser<Derived1>
リストを作成したいのUser<Derived2>
ですが、次のコードはC#3.0でコンパイルできません。
何か案は?
c# - ジェネリックメソッドの型パラメータを部分的に指定する方法
以下のような拡張メソッドがあります。
現在、次の方法で使用できます。
これはかなり問題なく動作しますが、2 番目の型パラメーターは非常に厄介です。C# 4.0 で GetValueAs を書き直すことは可能ですか? メソッドがさまざまな種類の文字列キー辞書に適用可能であり、呼び出しコードで 2 番目の型パラメーターを指定する必要がありません。つまり、使用します。
たは少なくとも次のようなものれ以外のp>java - Javaジェネリック共分散
次の記事を理解するのに問題があります: http ://www.ibm.com/developerworks/java/library/j-jtp01255.html
下、
ジェネリックは共変ではありません
著者は次のように述べています。
lnはリストであるため、それにFloatを追加することは完全に合法のようです。しかし、lnがliでエイリアス化されている場合、liの定義に暗黙的に含まれている型安全性の約束が破られます。これは整数のリストであるため、ジェネリック型を共変にすることはできません。
「lnがliでエイリアスされた場合」と書かれている部分がわかりません。作者はエイリアスとはどういう意味ですか?(参照?)。引用された行の上のコードスニペットは、Javaで何が違法であり、なぜではないかを示しているようです。誰かが例を挙げて説明できれば、私にとって非常に役に立ちます。前もって感謝します。
c# - 共分散と反分散の実世界の例
現実の世界で共分散と反分散をどのように使用するかを理解するのに少し苦労しています。
これまでに見た唯一の例は、同じ古い配列の例です。
他の場所で使用されているのを見ることができれば、開発中に使用できる例を見るといいでしょう.
c# - ジェネリックスのキャストとジェネリック型
考えてみてください。私には次の3つのクラス/インターフェースがあります。
MyClass<Derived>
そして、私はaMyClass<IMyInterface>
またはその逆にキャストできるようにしたいと思います:
しかし、試してみるとコンパイラエラーが発生します。
私がこれを行うことができない非常に正当な理由があると確信していますが、私はそれを考えることができません。
私がこれをやりたい理由について-私が想像しているシナリオは、MyClass<Derived>
多くの厄介なキャストを回避するためにインスタンスを操作するのが理想的ですが、インスタンスを受け入れるインターフェイスにインスタンスを渡す必要がありますMyClass<IMyInterface>
。
だから私の質問は2つあります:
- これら2つのタイプの間でキャストできないのはなぜですか?
MyClass<Derived>
これをにキャストできる一方で、インスタンスを操作することの素晴らしさを維持する方法はありますMyClass<IMyInterface>
か?
c# - C# 4 の共分散はジェネリックのネストをサポートしていますか?
以下の「x」が変換される理由がわかりませんが、「y」と「z」は変換されません。
新しい共分散機能は単にジェネリックのジェネリックでは機能しないのですか、それとも何か間違っていますか? (y と z を機能させるために .Cast<> を使用することは避けたいと思います。)
c++ - shared_ptrを返すときに共変の戻り値の型を達成する方法は?
戻り値の型は共変ではありません (したがって、合法でもありません) が、代わりに生のポインターを使用していた場合は共変になります。もしあれば、これを回避するために一般的に受け入れられているイディオムは何ですか?
scala - Scala でサブタイプと戻り値の型を使用してジェネリック オブジェクトを特定のオブジェクトに処理する
これは共分散に関するものだと思いますが、私はこのトピックに弱いです...
データベースの永続化などに使用される一般的な Event クラスがあります。次のようにしましょう。
ただし、さまざまなイベント動詞がたくさんあり、これらのさまざまなイベント タイプでパターン マッチングなどを使用したいので、対応するケース クラスをいくつか作成します。
ここで問題は、一般的なイベントを特定のケース クラスに簡単に変換するにはどうすればよいかということです。
これは私の最初の刺し傷です:
残念ながら、これは間違っています。
私よりも優れたタイプフーを持つ誰かが、1) 私がやりたいことが可能かどうか (または、その点で合理的かどうか)、および 2) 可能であれば、どのように修正するかを説明できますかevent2CC
? ありがとう!
c# - C# の共変インターフェイスと反変インターフェイスについて
私は C# で読んでいる教科書でこれらに出くわしましたが、おそらくコンテキストが不足しているため、理解するのが困難です。
それらが何であり、何に役立つかについての簡潔な説明はありますか?
明確にするために編集:
共変インターフェース:
反変インターフェース: