我想编写一个比较器,用于对具有数字类型参数的对象进行排序。我创建了一个通用的 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();
有人可以解释这种行为吗?
最佳答案
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
本身具有可比性,因此您将能够提供有意义的实现。
关于java - 为什么类型推断在这种情况下不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28792100/