Java 通用比较器未检查警告

标签 java generics variadic-functions

我编写了一种帮助方法,将多个比较器组合为一个:

public static <T> Comparator<T> createComparatorChain( final Comparator<T>... comparators )
{
    return new Comparator<T>()
    {
        public int compare( T lhs, T rhs )
        {
            for( Comparator<T> comparator : comparators )
            {
                int order = comparator.compare( lhs, rhs );
                if( order != 0 )
                {
                    return order;
                }
            }
            return 0;
        }   
    };
}

但是如果我使用此方法,则会收到未经检查的警告:

Collections.<File>sort( list, ComparatorUtils.<File>createComparatorChain( BY_FILE_DIRECTORY, BY_FILE_NAME ) );

类型安全:为可变参数创建比较器的通用数组。

我的通用语法有问题吗?谁能帮帮我。

最佳答案

I something in my generic syntax wrong?

不,这只是 Java 泛型如何实现的另一个问题。基本上,数组和泛型类型不能很好地协同工作。请参阅Java generics FAQ了解更多详情。

在这种特殊情况下,我不是从数组构建链,而是从链接在一起的多个比较器构建链 - 每个比较器都知道优先级较高的比较器和当前优先级较低的比较器。这样就避免了数组。每个比较器只要求其父比较器执行比较,如果结果非零,则直接返回结果,或者执行自己的比较,否则返回结果。 “顶部”比较器没有父级,因此仅执行其自己的比较。

幸运的是,您甚至不需要自己编写这个 - 您可以使用 Guava要么是 ComparisonChain Ordering.compound 。请注意,有 compound 的过载。这类似于您的数组版本,但采用 Iterable<? extends Comparator<? super T>>参数 - 是安全的。

关于Java 通用比较器未检查警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15964251/

相关文章:

java - 从泛型类型获取类

java - 对 Java 中的泛型感到困惑

scheme - 如何使用未知数量的变量定义函数?

java - 在 Java Web Start 中运行时,Swing Timer 不会停止触发事件

java - Google 日历 API Java 403

generics - Kotlin List<T> 包含来自 T 以外类型的对象

c# - 为什么要使用 params 关键字?

java - 了解 Java 中的链表

java - Java中的byte[]到String : What does the output mean?

c++ - 如何用未知类型包装可变参数函数?