在排序方法中使用匿名类

时间:2018-11-10 17:49:57

标签: java comparator anonymous-inner-class

为什么我在List的sort方法中将带有Comparator的匿名类放到编译器中显示错误?

我的代码:

public class Example2 {

public static void main(String[] args) {
   List<String> l = Arrays.asList("a","b","c","d");
   l.sort(Comparator<String> c= new Comparator<>() {   //compiler error
        public int compare(String a, String b) {
            return b.compareTo(a);
        }
   });

}

sort方法接受比较器。如果我编写此代码,它将编译:

public class Example2 {

public static void main(String[] args) {
   List<String> l = Arrays.asList("a","b","c","d");
   l.sort(new Comparator<String>() {                  //it's ok
        public int compare(String a, String b) {
            return b.compareTo(a);
        }
   });

}

或此代码:

public class Example2 {

public static void main(String[] args) {
   List<String> l = Arrays.asList("a","b","c","d");
   Comparator <String> c = new Comparator<String>() {     
        public int compare(String a, String b) {
            return b.compareTo(a);
        }
   };
   l.sort(c);                               //it's ok

}

为什么会发生?

非常感谢!

3 个答案:

答案 0 :(得分:2)

在第二个示例中,您没有为该方法提供比较器,而是将其分配给“ c”引用。在第三个示例中,您将其分配给c引用,然后将其分配给sort方法。

希望这会有所帮助:)

答案 1 :(得分:2)

第一个失败,因为它是一个分配。 sort方法需要Comparator类的对象。因此,当您说sort(new Comparator)时,就是在创建一个新的Comparator并将其立即传递给sort方法。当您拥有Comparator c = new Comparator()并具有sort(c)时,您将创建一个新的Comparator,将其存储在变量c中,并将其传递给sort方法。

第一段代码试图将新的Comparator分配给变量c并将其传递给方法sort,java的语法不允许这样做。这与使用一个以一个整数作为参数并写入foo(int bar = 7)的方法是相似的。这不太有意义。

答案 2 :(得分:2)

这里的问题不是您要传递一个匿名类。

l.sort(Comparator<String> c= new Comparator<>() { ... });

这正试图声明变量c。变量声明是语句,因此不能在表达式内部使用。 (在声明匿名类时,您也不能使用菱形运算符。)

如果要声明一个变量来保存该比较器,并在排序调用中分配它,可以这样:

Comparator<String> c;
l.sort(c = new Comparator<String>() { ... });

但是我怀疑那不是你想要的。