java - 类型转换比较器为子类工作

标签 java generics casting

在实践中,执行以下操作是否安全?

public static <T> Comparator<T> downcast(final Comparator<? super T> orig) {
    @SuppressWarnings("unchecked")
    Comparator<T> casted = (Comparator<T>) orig;
    return casted;
}

这是一个人为的用法示例:

public static <T> Comparator<T> chainComparators(final Comparator<? super T> a,
        final Comparator<? super T> b) {
    if (a == null) {
        return downcast(b);
    }
    if (b == null) {
        return downcast(a);
    }
    return new Comparator<T>() {
        @Override
        public int compare(T o1, T o2) {
            int i = a.compare(o1, o2);
            if (i == 0) {
                i = b.compare(o1, o2);
            }
            return i;
        }
    };
}

public static Comparator<Integer> ODD_FIRST_COMPARATOR = new Comparator<Integer>() {
    @Override
    public int compare(Integer i1, Integer i2) {
        boolean isEven1 = (i1.intValue() % 2) == 0;
        boolean isEven2 = (i2.intValue() % 2) == 0;
        return Boolean.compare(isEven1, isEven2);
    }
};

public static Comparator<Number> ABS_NUMBER_COMPARATOR = new Comparator<Number>() {
    @Override
    public int compare(Number n1, Number n2) {
        double d1 = Math.abs(n1.doubleValue());
        double d2 = Math.abs(n2.doubleValue());
        return Double.compare(d1, d2);
    }
};

public static void main(String[] args) {
    Comparator<Integer> comp = null;
    comp = chainComparators(comp, ODD_FIRST_COMPARATOR);
    comp = chainComparators(comp, ABS_NUMBER_COMPARATOR);

    List<Integer> list = new ArrayList<Integer>();
    list.add(-42);
    list.add(-23);
    list.add(-15);
    list.add(-4);
    list.add(8);
    list.add(16);

    Collections.sort(list, comp);
    System.out.println(list); // prints [-15, -23, -4, 8, 16, -42]
}

我知道我可以做到 chainComparators()返回 Comparator<? super T>而不是使用 downcast() ,或者我可以更改所有代码以不使用或显式检查空比较器(这也消除了使用向下转型的需要),但这些更改似乎都不值得为大型代码库付出努力。有没有合理的情况downcast()chainComparators()会失败吗?

最佳答案

如果你不想要未经检查的警告,你总是可以这样做:

public static <T> Comparator<T> downcast(final Comparator<? super T> orig) {
    return new Comparator<T>() {
        @Override
        public int compare(T o1, T o2) {
            return orig.compare(o1, o2);
        }
    };
}

关于java - 类型转换比较器为子类工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14806198/

相关文章:

java - 无法使用vertx创建文件

c - 在 g_malloc() 之后分配给 uint* 时为 "invaiid operands to binary *"

java - 对象创建/声明不同

java - 从 HTTP 请求设置 cookie

java - 使用 Java 中的 JsonPath 解析 JSON 中的数组

java - 非法状态异常 : Fragment null must be a public static class to be properly recreated from instance state

c# - 将一个模型转换为另一个模型的通用方法

c# - C# 7 中的模式匹配应该使用泛型吗?

Java - 为外部库中的类定义公共(public)接口(interface)

c - C 函数中的奇怪行为,字符串未保留