問題タブ [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 - コンパイラまたはタイプチェッカー(javac)でスタックオーバーフローを引き起こすJavaスニペット?
昨日のセミナーで、プレゼンター(Peter Sestoft)は、共分散と逆分散の両方を特徴とする3つのクラスを持つ小さなJavaプログラムを示しました。javacを使用してコンパイルしようとすると、タイプチェッカーはStackOverflowExceptionをスローします。
このスニペットは、Microsoftで働いている何人かの人によって開発されています(1人はケネディと呼ばれていたと思います)。
Googleを使用してそれを見つけることができません。コードスニペットを知っている人はいますか?ここに貼り付けて(最大10行のコード)、誰でも見ることができますか?:)
とても楽しかったです...
c# - リストを変換リストする
List<>
基本クラス/インターフェースから継承できますが、同じクラス/インターフェースを使用し て宣言できないのはなぜですか?
回避策はありますか?
inheritance - order を拡張する scala クラスを拡張する
Ordered[Base] を拡張する基本クラスの拡張に問題があります。私の派生クラスは Ordered[Derived] を拡張できないため、TreeMap のキーとして使用できません。TreeMap[Base] を作成し、Derived で比較をオーバーライドするだけで機能しますが、それは私が望むものではありません。派生クラスをキーにできるようにしたいです。これを回避する方法はありますか?
編集
scala メーリング リストでのこの議論は非常に関連性が高いように思えますが、少し迷ってしまいます。
generics - IEnumerableに対する型推論
この種のことについてはすでにスタックオーバーフローにいくつかの投稿がありますが、まったく同じではありません-したがって、これがすでに回答されているものである場合は、事前にお詫び申し上げます。
なぜこれが機能しないのですか?
上記のGo()を呼び出して、MyBaseオブジェクトのロードを渡すと、Fooを呼び出すたびに汎用のFoo()が呼び出され、trueが返されます。
代わりに、専用のMyBaseバージョンを呼び出さないのはなぜですか?Foo(new MyBase())を直接呼び出すと、どの呼び出しを行うかが正しく推測されます。これは、C#3のコレクションの共分散が不足しているためですか、それとも私は愚かでこれを正しく行っていないのですか?
ありがとう!
アイザック
java - 共変の戻り型とは何ですか?
Javaの共変戻り型とは何ですか? 一般的にオブジェクト指向プログラミングでは?
c# - C# 3 でのインターフェイス継承 (co(ntra)-variance?) によるジェネリック型推論
次の 2 つのジェネリック型があります。
ここで、これらのインターフェイスのコレクションの拡張メソッドを定義したいと思います。これらはどちらも、IRange<T>
またはその子孫であるためIRange<T>
、両方を処理する 1 つのメソッドを定義できることを望んでいました。このメソッドは、2 つの違いを処理する必要はなく、 からの共通部分のみを処理する必要があることに注意してくださいIRange<T>
。
したがって、私の質問は次のとおりです。
IEnumerable<T>
これら 2 つのタイプのいずれかのコレクション ( ) を処理する拡張メソッドを 1 つ定義できますか?
私はこれを試しました:
IEnumerable<IRange<Int32, String>>
ただし、次のように を渡します。
次のコンパイラ エラーが表示されます。
エラー 1 'System.Collections.Generic.IEnumerable>' には 'Slice' の定義が含まれておらず、タイプ 'System.Collections.Generic.IEnumerable>' の最初の引数を受け入れる拡張メソッド 'Slice' が見つかりませんでした ( using ディレクティブまたはアセンブリ参照がありませんか?) C:\Dev\VS.NET\LVK\LVK.UnitTests\Core\Collections\RangeTests.cs 455 26 LVK.UnitTests
注:コンパイルできるとは思っていませんでした。co(ntra)-variance (どちらがどちらの方向であるかを知る必要がある日) について十分に理解していて、それがうまくいかないことを知っています。私の質問は、Slice 宣言を機能させるために何かできることがあるかどうかです。
わかりましたので、範囲インターフェイスの型を推測しようとしIEnumerable<R>
ましR
たIRange<T>
。
だから私はこれを試しました:
これは私に同じ問題を与えます。
それで、これを微調整する方法はありますか?
そうでない場合、私の唯一のオプションは次のとおりです。
- 2 つの拡張メソッドを定義し、おそらくコレクションの 1 つを基本インターフェイスを含むコレクションに変換することによって、内部メソッドを内部的に呼び出しますか?
- C# 4.0 を待ちますか?
2 つのメソッドを定義する方法を以下に示します (注: まだ設計の初期段階にあるため、まったく機能しない可能性があります)。
これが私の問題を示すサンプルプログラムコードです。
Main メソッドで呼び出しを Slice1 から Slice2 に変更すると、両方の使用法でコンパイラ エラーが発生することに注意してください。
c# - 共変性の説明
まず、SOやブログで共変性と反変性について多くの説明を読みました。共変性と反変性に関するこのような素晴らしいシリーズを作成してくれたEricLippertに大いに感謝します。
しかし、私は少し頭を動かそうとしているというより具体的な質問があります。
エリックの説明によると、共変性と反変性はどちらも変換を表す形容詞であると私が理解している限りです。共変変換は型の順序を保持する変換であり、反変変換はそれを逆にする変換です。
私は、ほとんどの開発者が直感的に理解できるような方法で共分散を理解しています。
ここでの戻り操作は、両方の動物が哺乳類またはキリンよりもまだ大きいサイズを維持しているため、共変です。その点で、ほとんどの戻り演算は共変であり、反変演算は意味がありません。
もちろん、このコードはほとんどの開発者にとって意味がありません。
私の混乱は、共変性の引数パラメーターにあります。あなたが次のような方法を持っていた場合
私は常に、入力パラメーターが常に反変の振る舞いを強制することを学びました。タイプが入力パラメーターとして使用される場合、その動作は反変である必要があります。
ただし、次のコードの違いは何ですか
あなたがこのようなことをすることができないのと同じトークンであなたはすることができません
私が求めているのは、メソッド引数が反変変換を通過させる理由だと思います。
長い投稿でごめんなさい、多分私はこれを間違って理解しています。
編集:
以下のいくつかの会話によると、たとえばデリゲートレイヤーを使用すると、明らかに共変性を示すことができることを理解しています。次の例を考えてみましょう
もちろん、これは違法です。なぜなら、誰かが任意の動物をsomeActionに渡すことができるのに対し、ProcessMammalは、哺乳類またはより具体的なもの(哺乳類よりも小さい)を期待しているからです。これが、someActionがActionまたはより具体的なもののみである必要がある理由です(アクション)
ただし、これは中央にデリゲートのレイヤーを導入しています。反変の投影が発生するためには、中央にデリゲートが存在する必要がありますか?また、Processをインターフェイスとして定義する場合、引数パラメーターを反変型として宣言するのは、上記で示したデリゲートを誰かに実行させたくないからです。
generics - .net4ジェネリックに関する質問
私は次のクラス構造を持っています:
これにより、C#4.0で次のコンパイルエラーが発生します。タイプ「Test.Y」は、ジェネリック型またはメソッド「Test.Z」のタイプパラメーター「T」として使用できません。'Test.Y'から'Test.BInterface'への暗黙の参照変換はありません。
ジェネリックスの共分散はこれを機能させるはずですが?どんな助けでもありがたいです。
c# - C# の差異の問題: リストの割り当てリストとして
次の例を見てください ( MSDN ブログから一部抜粋)。
これは共分散の問題ですか?これは将来の C# リリースでサポートされますか? また、巧妙な回避策 (.NET 2.0 のみを使用) はありますか?