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

标签 java generics type-inference

我想编写一个比较器,用于对具有数字类型参数的对象进行排序。我创建了一个通用的 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/

相关文章:

f# - 如何在我自己的代码中生成类似于 FSI 的 F# 类型签名?

Java 可重入锁和条件 |生产者完成工作,消费者陷入困境

c# - 使用泛型声明 NancyModule

c# - 无效方差 : The type parameter must be invariantly valid but is covariant

java - 在java中声明双重使用通配符

Java:返回一个实现具有类型推断的接口(interface)的类

java - JAVA中如何知道ConcurrentHashMap上没有运行任何操作或者处于Idle状态?

具有可更新 JProgressBar 的 Java Swing 线程

java - Eclipse 导入 Maven 配置文件中声明的依赖项

F# 管道和函数应用程序之间的神秘差异