問題タブ [pecs]
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 - PECS(生産者拡張消費者スーパー)とは何ですか?
ジェネリックについて調べているときに PECS ( Producer extends
and Consumersuper
の略) に出会いました。
extends
との間の混乱を解決するために PECS を使用する方法を誰か説明してもらえますかsuper
?
java - Java の TreeSet.add() が PECS の原則に準拠していない問題 (Generics)
次のコードがあります。
no suitable method for...
セグメントインスタンスを追加すると、Java のツリーセットは PECS 原則を適用していないようです。この問題の解決策はありますか?
解決
私は実装しました:
でSegmentImpl_v1
それを呼び出しますsomeFunction()
。
java - さまざまな抽象化のジェネリックパラメーターを受け入れる単一のメソッドを作成することは可能ですか?
この質問のフォローアップとしてDog
、適切な部屋にを追加する単一のメソッドを作成することは可能ですか?Animal
(この例では、部屋または部屋のいずれかを受け入れますDog
。)または、次のように2つの異なるメソッドを作成する必要がありますか?(型消去のためにオーバーロードに頼ることさえできません)。
java - Java ジェネリック PECS
PECS の意味を知っています。
プロデューサーエクステンド、コンシューマースーパー。
問題は、それが消費者か生産者かをどうやって知ることができるでしょうか?
また、このコードは「PECS」に従っていますか
java - コレクションに a 型のサブクラスを追加することが違法なのはなぜですか?
このコードスニペットを考えると
num.add(doub) が許可されないのはなぜですか? List<List<Number>>
のスーパータイプで
はありませんList<List<Double>>
か?
java - 「スーパー」タイプの境界付きジェネリック メソッド
私が読んだ文献によると、次のインターフェースを実装したジューシーな果物があります。
制限された型変数を使用すると、次のメソッドはたくさんの果物を取り、それらすべてを絞ります:
ここで、以下の下位の兄弟も機能する必要があります。
したがって、メソッドは次のようになると思います。
代わりに、メソッドのシグネチャは次のようになります。
この違いを説明するものは何ですか?
java - Java Generics (制限されたワイルドカード)
Joshua Bloch の著書「Effective Java」によると、ジェネリクスで制限付きワイルドカードをいつどのように使用するかについてのルールがあります。このルールが PECS (Producer-Extends, Comsumer-Super) です。次の例を調べると:
このルールがこの例に完全に適合することを理解しています。pushAll
メソッドを次のサンプルとして宣言する必要があります。
しかし、次の例があるとどうなりますか?
次のように宣言する必要がpushAll
あります。
PECS規則によれば、上記の宣言は誤りです。しかし、私はStack
ofを持ち、Integer
これに渡したいStack
a Number
。なぜそれをしないのですか?
キーワード
を常に使用する必要があるのはなぜですか? extends
使い方super
が間違っているのはなぜですか?
もちろん、消費者の視点も同じです。なぜ消費者は常にあるべきなのsuper
ですか?
PS: より具体的に言うと、上記の例は、参照されている本のセクション「項目 28」にあります。
java - Java、ジェネリック、PECS: C の部分を理解するのにまだ苦労しています。具体例?
ここに 1 つのリンクを掲載しますCollections.sort()
。これを含め、PECS パラダイムに関して SO に関する多くの投稿がありました。私自身の個人的なコードでは、ジェネリックをかなり多く使用していますが、P 部分 (つまり<X extends SomethingElse>
) しか使用したことがありません。
Collections.sort
ジェネリック引数として a を期待します<T extends Comparable<? super T>>
。super
私はそこにキックがどこにあるのかわかりません。これが必要な理由の具体例はありますか?
私がそれに取り組んでいる間、私は P の完全な含意も理解していないことを深く恐れています...私は、P が P であり、C が C であるという明確で明白な証拠を持っていないまま、非常に多くのリンクを読みました。 ..
EDITに関しては、すでにここに回答があるかもしれません」:いいえ、申し訳ありません。私はこのリンクとSOに関する他の多くのリンクを読みました。これはまだ、すべての背後にあるコアメカニズムを教えてくれません。実際、これまでに見つけたすべてのリンクよりも多くのヒントがあります。
java - Java のジェネリックを使用したプロデューサーとコンシューマー
特定のクラスのインスタンスであるオブジェクトを取得するこのメソッドがあります。
メソッドを呼び出すには、次のようにします。
それは良いことですが、次の 2 つの方法でメソッドを呼び出せるようにしたいと考えています。
また
つまり、メソッドの結果を Dog コレクションまたは Animal コレクションに格納できるようにしたいということですDog.class
。Animal.class
私は次のようなことを考えていました:
しかし、うまくいきません。ヒントはありますか?
編集: 最後に、@Rohit Jain の回答を使用して、これは UtilitiesClass メソッドを呼び出すときの解決策です。
java - ジェネリックの put-get ルールを克服する
aに a を追加できないようにするジェネリックの get および put ルールについて読みました。Banana
List<? extends Fruit>
コンパイルエラーがなければ、次のことができることを理解しています。
同じリストに異なるオブジェクトタイプを取得するため、これは間違っているように聞こえます(@Tom Hawtinsによる理由を説明する回答を見て、彼を信じました:)(ただし、リンクが見つかりません))。
ただし、以下を実装する場合:
そして、次のようにします。
コンパイル エラーは発生せず、次の (予期される) 出力が得られます。
そうすることで契約に違反しますか?または、保護を回避していて、それを行うべきではありませんか?