通用链式比较器出错

Geting Error For Generic Chained Comparator

在问这个问题之前我想说我是 Java Generics 的新手。我试图为 class 实现比较器链接,所以我在 class.

之后创建了它
    static class ChainComparator implements Comparator<StudentDTO> {
    
    List<Comparator<StudentDTO>> chainComparators;

    @SafeVarargs
    public ChainComparator(Comparator<StudentDTO>... comparators) {
        chainComparators = Arrays.asList(comparators);
    }

    @Override
    public int compare(StudentDTO o1, StudentDTO o2) {
        for (Comparator<StudentDTO> comparator : chainComparators) {
            int result = comparator.compare(o1, o2);
            if (result != 0) {
                return result;
            }
        }
        return 0;
    }
}

这是我为 Student class 的多个比较器实现创建的 class。现在我认为这对所有 classes 都是通用的,所以我尝试了以下 class.

public class ChainComparator implements Comparator<Class<?>>{
    List<Comparator<?>> chainComparators;

    @SafeVarargs
    public ChainComparator(Comparator<?>... comparators) {
        chainComparators = Arrays.asList(comparators);
    }
    @Override
    public int compare(Class<?> o1, Class<?> o2) {
        for (Comparator<?> comparator : chainComparators) {
            int result = comparator.compare(o1, o2);
            if (result != 0) {
                return result;
            }
        }
        return 0;
    }
}

但是这里我得到以下编译错误

The method compare(capture#1-of ?, capture#1-of ?) in the type Comparator<capture#1-of ?> is not applicable for the arguments (Class<capture#2-of ?>, Class<capture#3-of ?>)

我在下面的行中收到上述错误

comparator.compare(o1, o2);

任何人都可以帮助我理解为什么我会收到此错误以及如何解决此错误或我的方法本身是错误的。

我可以理解如果我使用任何其他库或 Java8 我可以使用像样的代码很快实现这一点,但实际上我只是好奇并且想更多地学习和理解 Generic。

这里不能使用通配符,因为每个通配符都是独立的。

Comparator<?>compare(Class<?> o1, Class<?> o2)可以理解为Comparator<A>compare(Class<B> o1, Class<C> o2),其中ABC 每个都可以是任何东西(通配符),但是你当然不能比较 Class<B>Class<C>.

您需要做的是声明一个泛型参数。

static class ChainComparator<T> implements Comparator<T> {
    
    List<Comparator<T>> chainComparators;

    @SafeVarargs
    public ChainComparator(Comparator<T>... comparators) {
        chainComparators = Arrays.asList(comparators);
    }

    @Override
    public int compare(T o1, T o2) {
        for (Comparator<T> comparator : chainComparators) {
            int result = comparator.compare(o1, o2);
            if (result != 0) {
                return result;
            }
        }
        return 0;
    }
}

然后您将使用菱形运算符使用它:

Comparator<Foo> chain = new ChainComparator<>(fooComparator1, fooComparator2);