List<? extends Object> list = new ArrayList<? extends Object>();
arraylistを使用するときにジェネリックをオブジェクトに拡張できない理由を説明してくれる人はいますか?
arraylistを使用しているときに、ジェネリックをオブジェクトにスーパークラス化できないのはなぜですか?
ワイルドカードのパラメーター化された型をインスタンス化できないためです。具体的なパラメーター化された型のみを使用できます。ワイルドカードのパラメーター化された型を式に使用することはできませんnew
。
もちろん、ワイルドカードのパラメーター化された型を参照型として使用できます。それらをインターフェースと考えてください。インターフェイス自体をインスタンス化することはできませんが、参照型として使用できます。
したがって、宣言を次のように変更します。
List<? extends Object> list = new ArrayList<Object>();
ただし、ここでの唯一の問題は、このリストに何も追加できないことです。実際、この list の宣言が本当に必要だと思います。クラスのオブジェクトとそのサブクラスのいずれかを追加できるリストが必要な場合は、上限のあるワイルドカードは必要ありません。
たとえばEmployee
、 、Doctor
、およびStudent
を同じリストに格納したい場合、それらすべてが から拡張されているPerson
場合、次のようにリストを宣言するだけです。
List<Person> persons = new ArrayList<Person>();
persons.add(new Employee()); // This is OK
persons.add(new Student()); // This too is OK