問題タブ [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.
java - リストができない理由を説明する簡単な方法動物 = 新しい ArrayList()?
私はなぜそれをしてはいけないのかを知っています。しかし、なぜこれが不可能なのかを素人に説明する方法はありますか。これは素人にも簡単に説明できますAnimal animal = new Dog();
。犬は動物の一種ですが、犬のリストは動物のリストではありません。
c# - 反変性とEntity Framework 4.0:EntityCollectionをIEnumerableとして指定する方法は?
Entity Framework 4 を使用してエンティティとして実装するいくつかのインターフェイスを指定しました。
上記から次のコンパイラ エラーが表示されます。
「Demo.ConcreteContainer」はインターフェイス メンバー「Demo.IContainer.Children」を実装していません。「Demo.ConcreteContainer.Children」は「Demo.IContainer.Children」を実装できません。「System.Collections.Generic.IEnumerable」の一致する戻り値の型がないためです。
私の現在の理解では、これはIEnumerable(EntityCollectionによって実装されています)が共変ですが、おそらく反変ではないためです。
この型パラメーターは共変です。つまり、指定した型またはより派生した型のいずれかを使用できます。共分散と反分散の詳細については、ジェネリックにおける共分散と反分散を参照してください。
私は正しいですか、もしそうなら、IContainer
具象クラスを使用するのではなく、純粋に他のインターフェースに関してインターフェースを指定するという私の目標を達成する方法はありますか?
それとも、もっと根本的なことを誤解していますか?
c# - Generics と Linq をより有効に活用して、パラメータ化された型のリストをインスタンス化する
1 つ以上のハッシュ アルゴリズムを使用してファイルをハッシュしています。必要なハッシュ タイプをパラメータ化しようとすると、思っていたよりもかなり複雑になりました。
ジェネリックや LINQ をより有効に活用するチャンスを逃していると思います。また、Type[] をより具体的な型のセット (HashAlgorithm の子孫) に制限するのではなく、パラメーターとして使用する必要があることも好きではありません。型をパラメーターとして指定し、このメソッドに構築していますが、HashAlgorithm の呼び出し元の新しいインスタンスを渡すと、これは見栄えが良くなるでしょうか?
c++ - C++:キャストせずに継承されたクラスで「無効な共変の戻り値の型」を回避するにはどうすればよいですか?
クラスが相互に依存する非常に複雑なクラス階層があります。それぞれ C と A のインスタンスを返すメソッドを含む 2 つの抽象クラス A と C があります。継承されたクラスでは、共変型を使用したいと考えています。この場合、継承関係を前方宣言する方法がわからないため、これが問題になります。
"test.cpp:22: error: invalid covariant return type for 'virtual D* B::outC()'" エラーが発生します。これは、コンパイラが D が C のサブクラスであることを認識していないためです。
B::outC() の戻り値の型を C* に変更すると、例がコンパイルされます。継承されたクラスで B* と D* を戻り値の型として保持する方法はありますか (方法があることは直感的にわかります)。
generics - IEnumerable を受け取る関数はなぜIEnumerable を受け入れない?
たとえば、次のクラスがあるとします。
次に、次のコードを使用したいと思います。
しかし、これはエラーを生成します:
どうしてこれなの?MyFoo は IMyBar を実装しているため、MyFoo の IEnumerable を IMyBar の IEnumerable として扱うことができると考えられます。ありふれた現実世界の例として、車のリストを作成した後、それは車のリストではないと言われたことがあります。
それはほんの些細な迷惑ですが、誰かがこれに光を当てることができれば、私は大いに義務付けられます.
java - Java でのオーバーロードとオーバーライドの両方の場合に共変性と反変性を示す関数の例を教えてください。
Java における共分散と反分散の良い例を示してください。
c# - インターフェイスのメソッドを実装する際に、「共分散」と「反分散」の概念が適用されるのはなぜですか?
ユースケースは次のようなものです:
ここで私の質問は、Funda の Covariance と Contravariance を考慮すると、Clone() メソッドの戻り値の型として "SomeClass(As it is distributed from object)" を使用できないのはなぜですか?
このマイクロソフトの実装の背後にある理由を誰か説明してもらえますか????
c# - C# (4.0) がジェネリック クラス型で共変性と反変性を許可しないのはなぜですか?
その制限の本当の理由は何ですか?しなければならなかったのはただの仕事ですか?概念的に難しいですか?無理ですか?
確かに、フィールドは常に読み書き可能であるため、型パラメーターをフィールドで使用することはできません。でもそれじゃ答えにならないよね?
この質問の理由は、私が C# 4 のバリアンス サポートに関する記事を書いているためであり、それがデリゲートとインターフェイスに制限されている理由を説明する必要があると感じています。立証責任を逆転させるだけです。
更新: Eric が例について尋ねました。
これはどうですか(それが理にかなっているのかどうかはまだわかりません:-))
それを 1 つのクラスに持つ理由は、クラス自体に保持されているキャッシュである可能性があります。また、異なる種類のペットに同じ名前を付けないでください。
ところで、これはC# 5.0 のオプションの型パラメーターにつながります :-)
更新 2: CLR と C# がこれを許可する必要があると主張しているわけではありません。何がそれにつながったのかを理解しようとしているだけです。
c# - C#4.0 RC、Silverlight4.0RC共分散
C#4.0を使用してSilverlight4アプリケーションを開発しようとしています。私はこのようなケースがあります:
他の場所:
そして、私が問題を抱えている使用法:
ジェネリック型は「不変」だったので、C#3.0ではこれは不可能だったと思います。しかし、これはジェネリックテクノロジーの新しい共分散によってC#4.0で可能だと思いましたか?
私が理解しているように、C#4.0では、分散をサポートするために多くの一般的なインターフェイス(IEnumerableなど)が変更されています。この場合、Foo
共変になるために私のクラスは何か特別なことをする必要がありますか?
また、Silverlight 4(RC)では共分散がサポートされていますか?
java - Generics : リストはリストと同じです?
extends
Java Generics のキーワードを理解しようとしています。
List<? extends Animal>
IS Aに任意のオブジェクトを詰め込むことができることを意味しList
ます Animal
次に、次も同じことを意味しません。
誰かが上記の2つの違いを知るのを手伝ってもらえますか? extends
ここでは冗長に聞こえます。
ありがとう!