我一直在寻找能帮助我解决问题的东西,但到目前为止还没有找到。我有以下的类:
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<?>>)
好的,在朋友的帮助下,经过几个小时的研究,我们发现问题出在抽象类Sort中的Collections#sort(List<T> list, Comparator<? super T> c)
方法上,因为我使用了一个Comparator<? extends T>
。
我使用泛型,因为我有两个模型,一个模型的超类是一个通用的抽象子类,由35个类继承,而第二个模型实际上有两个不同的超类,这两个超类组合起来又被35个类继承。这些层次结构是固定的,我无法修改它们。
这里的模型非常简单,但你明白我的意思。此外,还有一个工厂,根据T的类型返回一个排序器或另一个排序器。
请问有人能帮忙提供解决方案吗(即对一个通用列表进行排序;参数类型可以是通用超类或其子类之一)。
谢谢和最好的祝福, Domi