为什么类型推断在这种情况下不起作用
Why doesn't type inference work in this case
我想编写一个比较器,用于对具有数字类型参数的对象进行排序。我创建了一个通用的 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
本身具有可比性,您将能够提供有意义的实施。
像这样声明您的 class 会更简单:
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()));
}
}
我想编写一个比较器,用于对具有数字类型参数的对象进行排序。我创建了一个通用的 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
本身具有可比性,您将能够提供有意义的实施。
像这样声明您的 class 会更简单:
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()));
}
}