在排序方法中使用匿名 class

Use of anonymous class in sort method

为什么如果我在 List 的排序方法中放置一个带比较器的匿名 class,编译器会显示错误?

我的代码:

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);
        }
   });

}

排序方法接受比较器。如果我编写这段代码,它会编译:

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

}

为什么会这样?

非常感谢!

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

希望对您有所帮助:)

第一个失败,因为它是一个作业。 sort 方法需要 Comparator class 的对象。因此,当您说 sort(new Comparator) 时,您正在创建一个新的 Comparator 并立即将其传递给 sort 方法。当你有 Comparator c = new Comparator () 然后你有 sort(c) 时,你创建了一个新的 Comparator,将它存储在变量 c 中,并将它传递给 sort 方法。

第一段代码试图将一个新的比较器分配给变量 c 并将其传递给方法 sort,java 的语法不允许这样做。这类似于采用一个整数作为参数并编写 foo(int bar = 7) 的方法。这不太合理。

这里的问题不在于您传递的是匿名 class。

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

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

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

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

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