Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java通用比较器未检查警告_Java_Generics_Variadic Functions - Fatal编程技术网

Java通用比较器未检查警告

Java通用比较器未检查警告,java,generics,variadic-functions,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( C

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

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;
        }   
    };
}
公共静态比较器createComparatorChain(最终比较器…比较器)
{
返回新的比较器()
{
公共整数比较(左、右)
{
for(比较器比较器:比较器)
{
int顺序=比较器。比较(lhs,rhs);
如果(订单!=0)
{
退货单;
}
}
返回0;
}   
};
}
但如果我使用此方法,则会收到未经检查的警告:

Collections.<File>sort( list, ComparatorUtils.<File>createComparatorChain( BY_FILE_DIRECTORY, BY_FILE_NAME ) );
Collections.sort(list,ComparatorUtils.createComparatorChain(按文件目录,按文件名));
类型安全:为varargs参数创建一个通用的比较器数组

我的泛型语法有问题吗?有人能帮我吗

我的泛型语法有问题吗

不,这只是Java泛型如何实现的另一个问题。基本上,数组和泛型类型不能很好地结合在一起。有关更多详细信息,请参阅

在这个特殊的例子中,我不是从一个数组构建链,而是从几个连接在一起的比较器构建链——每个比较器都知道优先级较高的比较器和当前优先级较低的比较器。这样就避免了数组。每个比较器只要求其父级执行比较,如果结果为非零,则直接返回结果;否则,则执行自己的比较并返回结果。“顶级”比较器没有父级,因此只执行自己的比较


幸运的是,你甚至不需要自己写这篇文章——你可以与或一起使用。注意,
component
的重载与数组版本类似,但需要
Iterable这是泛型和varargs的经典问题。长话短说,这是因为varargs实际上是数组的语法糖。e、 g.在这种情况下,
比较器
具有类型
比较器[]
。在调用站点,编译器创建一个正确类型的数组。当然,正如您所知,Java不允许您执行
新比较器[]
,因此编译器会执行
新比较器[]
,并向您发出警告


重要的是要知道,“不安全”仅在依赖于
比较器的实际数组类型时发生。如果您只需要遍历它的元素(正如您的方法所做的),那么它仍然是完全安全的。若要以这种方式表明函数是安全的,如果您使用的是Java 7+,请在方法中添加
@SafeVarargs
注释,警告将停止。

您能告诉我们如何使用此比较器吗?