java 泛型比较器_带有泛型,比较器和排序错误的Java类层次结构

我一直在环顾四周,看看是否能找到可以帮助我解决问题的方法,但是到目前为止没有运气.我有以下课程:

public interface ISort {

public List sort(List initialList);

}

public abstract class Sort implements ISort {

private Comparator super T> comparator;

public Sort(Comparator super T> comparator) {

this.comparator = comparator;

}

@Override

public List sort(List initialList) {

ArrayList list = new ArrayList(initialList);

Collections.sort(list, comparator);

return list;

}

}

public abstract class InternalTreeItem {

public abstract String getValue();

}

public class D extends InternalTreeItem {

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 {

@Override

public int compare(D o1, D o2) {

return o1.getInteger() - o2.getInteger();

}

}

public class DSort extends Sort {

public DSort(Comparator comparator) {

super(comparator);

}

public DSort() {

super(new DComparator());

}

}

和测试类:

public class TestClass {

@Test

public void test1() {

List> list= new ArrayList>();

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)

in the type ISort

is not applicable for the arguments

(List>)

好的,经过几个小时并在朋友的帮助下,我们意识到问题出在抽象类Sort中的Collections#sort(List< T> list,Comparator&lt ;? super T> c),因为我使用了Comparator&lt ;?扩展T>.

我使用泛型,因为我有2个模型,一个模型的超类是由35个类子类化的泛型抽象,而第二个模型实际上有2个不同的超类,这些超类组合在一起,又由35个类子类化.这些层次结构已给出,我无能为力对其进行修改.

这里的模型非常简单,但是您明白了.另外,还有一个工厂,该工厂根据T的类型返回一个分类器或另一个分类器.

任何人都可以帮忙,并为我的问题提供解决方案(即对通用列表进行排序;参数类型可以是通用超类或它的子类之一).

谢谢和最诚挚的问候,

多美

解决方法:

一种解决方法是对不能更改的类使用包装器类.

因此,在您的示例中,您要基于Integer值对对象D的列表进行排序.通过将对象放入包装器中,然后将其添加到列表中,可以公开希望对列表进行排序的值.

例如,您可以定义如下接口:

private interface SortableListItem extends Comparable> {

public T getValue();

}

然后,为D创建一个包装器类:

public class DWrapper implements SortableListItem {

private D item;

public DWrapper(D item) {

this.item = item;

}

public Integer getValue() {

return item.getInteger();

}

public int compareTo(SortableListItem o) {

return getValue().compareTo(o.getValue());

}

}

在这里,创建和排序列表非常简单:

D item1= new D(1);

D item2= new D(10);

D item3= new D(5);

DWrapper wrapper1 = new DWrapper(item1);

DWrapper wrapper2= new DWrapper(item2);

DWrapper wrapper3= new DWrapper(item3);

List> sortableList = new ArrayList>();

sortableList.add(wrapper1 );

sortableList.add(wrapper2);

sortableList.add(wrapper3);

Collections.sort(sortableList);

您当然可以使包装器类接受一个更通用的对象-关键是每个对象都返回一个可以对List进行排序的值(在这种情况下为Integer).

标签:comparator,generics,java

来源: https://codeday.me/bug/20191210/2100885.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值