私は自分の問題を解決する何かを見つけるために周りを見回してきましたが、今まで運がありませんでした. 私は次のクラスを持っています:
public interface ISort<T> {
public List<T> sort(List<T> initialList);
}
public abstract class Sort<T> implements ISort<T> {
private Comparator<? super T> comparator;
public Sort(Comparator<? super T> comparator) {
this.comparator = comparator;
}
@Override
public List<T> sort(List<T> initialList) {
ArrayList<T> list = new ArrayList<T>(initialList);
Collections.sort(list, comparator);
return list;
}
}
public abstract class InternalTreeItem<T> {
public abstract String getValue();
}
public class D extends InternalTreeItem<Integer> {
private Integer i;
public D(Integer i) {
this.i = i;
}
@Override
public String getValue() {
return i.toString();
}
public Integer getInteger() {
return i;
}
}
public class DComparator implements Comparator<D> {
@Override
public int compare(D o1, D o2) {
return o1.getInteger() - o2.getInteger();
}
}
public class DSort extends Sort<D> {
public DSort(Comparator<D> comparator) {
super(comparator);
}
public DSort() {
super(new DComparator());
}
}
そしてテストクラス:
public class TestClass {
@Test
public void test1() {
List<InternalTreeItem<?>> list= new ArrayList<InternalTreeItem<?>>();
list.add(new D(1));
list.add(new D(10));
list.add(new D(5));
ISort<?> sorter = new DSort();
sorter.sort(list);
}
}
コンパイラは次の行でエラーを出します
sorter.sort(list);
と状態
The method sort(List<capture#2-of ?>)
in the type ISort<capture#2-of ?>
is not applicable for the arguments
(List<InternalTreeItem<?>>)
OK、友人の助けを借りて数時間後、問題はsort(List<T> list, Comparator<? super T> c)
抽象クラス Sort の Collections# にあることに気付きましたComparator<? extends T>
。
2 つのモデルがあるため、ジェネリックを使用します。1 つのモデルのスーパー クラスは 35 のクラスによってサブクラス化されたジェネリック抽象であり、2 番目のモデルには実際には 2 つの異なるスーパー クラスがあり、それらを組み合わせて再び 35 のクラスによってサブクラス化します。これらの階層は与えられたものであり、それらを変更するために私にできることは何もありません。
ここでのモデルは非常に単純ですが、要点はわかります。また、T のタイプに応じて、あるソーターまたは別のソーターを返すファクトリもあります。
誰でも助けて、私の問題の解決策を提供してもらえますか (つまり、ジェネリック リストをソートすることです。パラメーターの型は、ジェネリック スーパークラスまたはそのサブクラスの 1 つにすることができます)。
よろしくお願いします、 ドミ