我编写了一种帮助方法,将多个比较器组合为一个:
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/