私は質問q1、q2、q3を調べましたが、それらは私の質問を正確にカバーしていません。
ArrayList<A> and ArrayList<? extends A>
変数またはパラメーターを宣言するために使用されることに注意してください(新しいジェネリッククラスを作成するためではありません)。
オブジェクト属性を宣言するとき(ケース1)、両方の式は同等ですか?:
class Foo {
private ArrayList<A> aList; // == ArrayList<? extends A> aList;
}
編集:どちらの式も、どのような種類のオブジェクトを追加できるかという観点からは同等ですがaList
、次の場合と同じ意味で異なりますか?
ただし、パラメータ宣言で使用する場合は異なります(ケース2)?:
void methodFoo(ArrayList<A> al) != void methodFoo(ArrayList<? extends A> al)
ArrayList<A1>
最初のオブジェクトはArrayListオブジェクトの受け渡しのみを許可し、2番目のオブジェクトは送信を許可する「より寛容な」ようなものであるため
ArrayList<A2>
(A1とA2がAを拡張する限り)?
これが正しければ、2つの表現が事実上異なる他のシナリオはありますか?
ありがとう、