Java 泛型和扩展的比较

标签 java generics comparator comparable compareto

我需要构建一个具有通用字段的类Course(我无法添加另一个包含Comparator的字段)。

我需要为类Course创建一个Comparator,以便可以使用它自己的CompareTo方法来比较通用字段(如果String-compareTo 按字符串,如果按整数等..):

方法getGeneric()返回通用字段。

new Comparator<Course<?>>( {
    public int compare(Course<?> o1, Course<? extends Comparable<?>> o2) {
        return (o1.getGeneric()).compareTo(o2.getGeneric());
    }
});

最佳答案

您可能应该做的是拥有一个声明可比较的 T 的方法。 ,并返回 Comparator<Course<T>> .

public static <T extends Comparable<T>> Comparator<Course<T>> comparator() {
    return new Comparator<Course<T>>() {
        @Override
        public int compare(Course<T> o1, Course<T> o2) {
            // I don't want to give away TOO much. :)
        }
    }
}

有一些方法可以做到这一点,而无需每次都创建新实例,但它们需要绕过类型系统,因此它们更高级。上述内容对于大多数用例来说应该没问题。

你也可以有 comparator函数取 Comparator<T>本身:

public static <T> Comparator<Course<T>> comparator(Comparator<T> innerComparator) {
    ...
}

这为您提供了额外的灵 active ,以及​​为没有自然比较的类型(即不实现 Comparable )创建比较器的能力。例如,您可以创建 Comparator<Course<Course<Integer>>> !

关于Java 泛型和扩展的比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20618503/

相关文章:

Java - 通用参数无法解析

c# - 如何检查通用类型 T 是否为 IEnumerable<T'>,其中 T' 未知

java - 使用比较器对对象进行排序给出空指针

java - 为什么使用 CachingParanamer 时 Paranamer 不返回方法名称?

java - SQL 命令未正确结束

java - 将 .dll 添加到 java 构建路径

c# - 不同属性的通用 foreach 循环

java - 按列表值对 Java Map 进行排序

sorting - Jasper Reports 使用 comparatorExpression 进行交叉表排序

java - 开源 Java 报告 + 图表