問題タブ [covariant]

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.

0 投票する
1 に答える
978 参照

c# - アカデミック: 共変ジェネリックで使用される場合の基本型の自動型推定

.NET 4.0 MS-C# コンパイラの自動型推論が失敗し、型を「手動で」指定しなければならないケースに出くわしました。

これは私にとって大きな問題ではありませんが、コンパイラが呼び出しの正しい型を自動的に見つけられない理由を知りたいと思うには十分です..

呼び出しを次のプログラムに減らしました。

"// 3" とマークされた Complex への最後の呼び出しのため、コードはコンパイルされません。

最初の呼び出しは簡単で簡単です。ベース/サブクラスは関係ありません。2 番目の呼び出しでは、すべてのパラメーターを「手動で」指定するだけです。

コンパイラーが、2 番目の呼び出しで使用されたパラメーターを 3 番目の呼び出しでも自動的に選択することを期待していました。確かに、2 番目のパラメーターは実際には "Derived" として指定されますが、これは "Base" に変換でき、最初のパラメーターは U が "Base" 型である必要があります。インターフェースの共変型のため、「ベース」を U として where 句を使用できるはずです。

C# でのジェネリック型パラメーター推定のルールは正確にはわかりませんが、「パラメーターの代入が 1 つしかない場合は、これを使用し、そうでない場合はコンパイルを拒否する」のように機能すると常に想定していました。

コンパイラが型を自動的に検出しないのはなぜですか? これは、「コンパイラがこれを行うことができれば、フェルマーの最終定理も解決できなければならない」ケースの 1 つですか? :D

0 投票する
3 に答える
241 参照

scala - 共変型の可変プライベート コレクションの使用

私は共変の Scala type を持っていThing[+B]ます。実装は、内部可変キューを使用します。

private val queue : AsyncQueue[B]()

AsyncQueue はカスタムの可変キュー実装であり、不変バージョンでは簡単に実装できない特別なプロパティを備えています。可変であるため、AsyncQueue は不変です。したがって、共変型では使用できませんThing

は非公開であるため、コードの正確性を保証できます。たとえば、 type の参照queueに代入しようとはしません。キャストを使用せずに共変を維持しながら、この作業を行うにはどうすればよいですか?queueQueue[Any]ThingB

(キャストを使用した解決策は、エンキュー/デキュー時にオブジェクトを宣言してAsyncQueue[Object]キャストすることですが、これは非常に見苦しいものです。)

ETA : 型の共分散を理解しています。共変型の AsyncQueue を宣言したり、AsyncQueue 自体を共変にすることができない理由も理解しています。私の質問は、どこでもキャストを使用しないようにこのコードを設計する方法です。

0 投票する
1 に答える
438 参照

c++ - テンプレートの戻り値の型を持つ仮想基本関数: テンプレート引数としてポインター型を持つ派生クラスでコンパイラーが失敗する (MSVC 2013)

テンプレート引数 T=int* を使用して CBaseInterface (以下のコードを参照) から派生させると、コンパイラはエラー C2555 で失敗します。これは、T に使用されるすべてのポインター型で発生します。代わりに typedef を使用すると、同じコードが正常に機能します。

ポインター型の問題はどこにありますか? 私は混乱しており、Microsoft のドキュメントには、この状況に適合するものは何も見つかりませんでした。

あなたが私を助けてくれることを願っています。

0 投票する
7 に答える
1811 参照

c++ - C ++の共変の戻り値の型とは正確には何ですか?

これを実行しようとすると、コンパイル エラーが発生します。

A と B は共変型であると想定しているため、A* と B* も (正しい?) である必要があります。推論により、私はそれも共変であるstd::vector<A*>と予想しstd::vector<B*>ていましたが、そうではないようです。なんで?

0 投票する
2 に答える
602 参照

java - インターフェイス、ジェネリック、および共変の戻り値の型

次のようなインターフェースがあるとします。

さて、次の両方が許されますか?

Bar2. _ Foo_ Integer_ Number_ 一方、これは共変の戻り値の型の場合ではないでしょうdoSomething()か。それとも、コンパイラはそのように検出するほど賢くないのでしょうか?

0 投票する
1 に答える
131 参照

c++ - C++ クラスの設計: 共分散

問題

グラフで機能し、ノードが類似しているかどうかを示すノードペアのスコアを返すアルゴリズムをいくつか実装したいと考えています。アルゴリズムは、単一のノード ペアとすべての可能なノード ペアで機能する必要があります。後者の場合、コレクション/マトリックスが返されます。

私のアプローチ

アルゴリズムはから派生します

現在、アルゴリズムはメモリ使用量が異なります。一部のアルゴリズムは対称的であり、(u, v) と (v, u) のスコアは同一です。これには、返されるさまざまな ScoreCollection タイプが必要です。例としては、疎行列と三角行列があり、どちらも から派生しScoreCollectionます。

これは、共変の戻り値の型に要約されます。

質問

  • この設計アプローチは、この問題に適していますか?
  • コレクションがすべて行列として実装されているという事実を公開する必要がありますか?
0 投票する
1 に答える
888 参照

java - Java共変配列が悪い?

何人かの人から、Java では共変配列のサブタイプが許可されている、つまり、A が B のサブタイプである場合、A[] は B[] のサブタイプであるが、これはランタイムにつながる可能性があるため、悪い機能であると言われました。エラー。実行時エラーがどのように発生するか、Java がこの問題にどのように対処するかを説明する具体的な例を教えてもらえますか?