あなたのクラスの共通の祖先はObject
であり、List<? extends Object>
物事をよりきれいにするわけではないため (結局のところ、すべてが extendsであるため)、それはOK の選択のObject
ように見えます。List<Object>
ただし、そのようなリストは混合バッグになります。内部のオブジェクトの実行時のタイプを確認し、それに基づいて決定を下す必要があります。これは間違いなく良いことではありません。
より良い代替手段は、リストの要素に対する操作を統一された方法で実装する独自のクラスを作成し、これらの操作を異なる方法で実装するサブタイプごとに 1 つのサブクラスを作成することです。これにより、リストを統一された方法で処理し、オブジェクトごとの差別化をラッパーにプッシュできます。
public interface ItemWrapper {
int calculateSomething();
}
public abstract class IntWrapper implements ItemWrapper {
private int value;
public IntWrapper(int v) {
value=v;
}
public int calculateSomething() {
return value;
}
}
public abstract class DoubleListWrapper implements ItemWrapper {
private List<Double> list;
public DoubleListWrapper (List<Double> lst) {
list = lst;
}
public int calculateSomething() {
int res;
for (Double d : list) {
res += d;
}
return res;
}
}
// ...and so on
ItemWrapper
オブジェクトのリストを作成し、calculateSomething
それらのタイプをチェックせずに作成できるようになりました:
List<ItemWrapper> myList = new ArrayList<ItemWrapper>();
for (ItemWrapper w : myList) {
System.out.println(
w.calculateSomething());
}