はじめまして。
タイトルの一言でうまく説明できないのですが、下記のようなクラス構成を考えています。
- AクラスはBクラスの親
- AElementクラスはBElementクラスの親
- AクラスはAElementクラスのリストをフィールドとして保持する
- BクラスはBElementクラスのリストをフィールドとして保持する
class A { private final List<? extends AElement> elements; public A(List<? extends AElement> elements) { this.elements = elements; } public List<? extends AElement> getElements() { return this.elements; } } class B extends A { public B(List<? extends BElement> elements) { super(elements); } } class AElement { } class BElement extends AElement { }
この時Bクラスのインスタンスにて、getElements()
を呼出した際に、BElementsのリストを返却したいです。
下記のようにBクラスにてgetElements()
をオーバーライドすれば取得できますが、型安全でないキャストを行っており、
そもそもの設計が破たんしているのではないかと考えています。
class B extends A { public B(List<? extends BElement> elements) { super(elements); } @Override @SuppressWarnings("unchecked") public List<? extends BElement> getElements() { return (List<? extends BElement>) super.getElements(); } }
このようなケースにてどのように書くのが or 設計するのが適切でしょうか。
なお、クラスに総称型を付与する対応が一番に考えられる(下記参照)と思いますが、A、Bクラスの呼出元に総称型を意識させたくありません。※AクラスとAElementクラス、BクラスとBElementクラスの紐付きは自明のものとするため。
class A<T extends AElement> { private final List<T> elements; public A(List<T> elements) { this.elements = elements; } public List<T> getElements() { return this.elements; } } class B<T extends BElement> extends A<T> { public B(List<T> elements) { super(elements); } } class AElement { } class BElement extends AElement { }
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。