为什么类型推断在这种情况下不起作用

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()));
  }
}