在这种情况下,为什么不进行类型推理

时间:2015-03-01 09:46:22

标签: java generics type-inference

我想编写一个比较器,用于对具有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();

有人可以解释这种行为吗?

2 个答案:

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