首页 > 解决方案 > 为什么用通配符创建的比较器的比较方法不能接受对象?

问题描述

在 Java 中,像这样创建比较器对象是合法的:

Comparator<? super Number> comparator = new Comparator<Object>() {
    @Override
    public int compare(Object o1, Object o2) {
        // implementation here
    }
};

但是您不能将此对象用于这样的简单调用:

Object o1 = new Object(), o2 = new Object();
comparator.compare(o1, o2);

为什么这样?我认为? super Number是指 Number 及其所有超类。

标签: javacomparator

解决方案


假设您使用的是? super Double

Comparator<? super Double> comparator = new Comparator<Object>() {
    // ...
};

你告诉编译器的是你有一个比较器

  • 可能是,Comparator<Double>
  • 可能是,Comparator<Number>
  • 可能是,Comparator<Object>
  • 可能是一个Comparator<Serializable>.

即使您使用 a 对其进行了初始化Comparator<Object>,编译器也不知道这一点,因为编译器不执行代码。编译器只知道该变量包含上述类型之一的 Comparator。

由于变量可能包含比 Object 类型更具体的比较器,因此编译器不会假定可以传递 Object。


推荐阅读