在排序方法中使用匿名类

为什么如果我在 List 的排序方法中放置一个带有 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


}

为什么会这样?


非常感谢!


梦里花落0921
浏览 149回答 3
3回答

明月笑刀无情

第一个失败,因为它是一项任务。sort 方法需要一个 Comparator 类的对象。因此,当您说 sort(new Comparator) 时,您正在创建一个新的 Comparator 并立即将其传递给 sort 方法。当你有 Comparator c = new Comparator () 然后你有 sort(c) 时,你创建一个新的 Comparator,将它存储在变量 c 中,并将它传递给 sort 方法。第一段代码尝试为变量 c 分配一个新的 Comparator 并将其传递给方法 sort,java 的语法不允许这样做。这类似于拥有一个将一个整数作为参数并写入 foo(int bar = 7) 的方法。这不太合理。

眼眸繁星

在第二个示例中,您没有将比较器提供给方法,而是将其分配给“c”引用。在第三个示例中,您将其分配给 c 引用,然后将其分配给 sort 方法。希望这可以帮助 :)

莫回无

这里的问题不是您正在传递一个匿名类。l.sort(Comparator<String> c= new Comparator<>() { ... });这是试图声明一个变量,c. 变量声明是语句,因此不能在表达式中使用。(声明匿名类时也不能使用菱形运算符)。如果你想声明一个变量来保存那个比较器,并在排序调用中分配它,你可以像这样:Comparator<String> c;l.sort(c = new Comparator<String>() { ... });但我怀疑这不是你想要的。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java