我想编写一个比较器,用于对具有Number类型参数的对象进行排序。我创建了一个通用的dto如下
public class GenericSortingDTO<T extends Number> {
private T parameter;
public T getParameter() {
return parameter;
}
public void setParameter(T parameter) {
this.parameter = parameter;
}
}
我创建了一个这样的比较器
import java.math.BigDecimal;
import java.util.Comparator;
public class WeightComparator implements Comparator<GenericSortingDTO<Number>> {
@Override
public int compare(GenericSortingDTO<Number> o1,
GenericSortingDTO<Number> o2) {
return new BigDecimal(o1.getParameter().toString()).compareTo(new BigDecimal(o2.getParameter().toString()));
}
}
现在,我尝试创建一个整数比较器的实例
Comparator<GenericSortingDTO<Integer>> genericComparator = new WeightComparator();
但我收到错误:Type mismatch: cannot convert from WeightComparator to Comparator<GenericSortingDTO<Integer>>
但是当我这样做时,它没有给出编译错误:
Comparator<GenericSortingDTO<Number>> genericComparator = new WeightComparator();
有人可以解释这种行为吗?
答案 0 :(得分:3)
GenericSortingDTO<Integer>
和
GenericSortingDTO<Number>
是两种截然不同的类型。他们之间没有历史关系。通过暗示,
也是如此Comparator<GenericSortingDTO<Integer>>
和
Comparator<GenericSortingDTO<Number>>
这两种类型不是赋值兼容的,因此编译错误。
但是,您无需限制WeightComparator
。您可以申报
public class WeightComparator implements Comparator<GenericSortingDTO<? extends Number>> {
@Override public int compare(GenericSortingDTO<? extends Number> o1, GenericSortingDTO<? extends Number> o2) {
return ...;
}
}
由于Number
可以自行比较,因此您可以提供有意义的实施。
答案 1 :(得分:0)
将这样的类声明为更简单:
public static class GenericSortingDTO<T extends Number>
implements Comparator<GenericSortingDTO<T>> {
//your current code here
@Override
public int compare(GenericSortingDTO<T> o1, GenericSortingDTO<T> o2) {
return new BigDecimal(o1.getParameter().toString()).compareTo(new BigDecimal(o2.getParameter().toString()));
}
}