代码之家  ›  专栏  ›  技术社区  ›  Sam

匿名类在排序方法中的使用

  •  1
  • Sam  · 技术社区  · 7 年前

    为什么如果我在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 回复  |  直到 7 年前
        1
  •  2
  •   Jacob    7 年前

    第一个失败,因为它是一个任务。sort方法需要一个Comparator类的对象。因此,当您说sort(newcomparator)时,您正在创建一个新的比较器,并立即将其传递给sort方法。当您使用Comparator c=new Comparator()时,然后使用sort(c),您将创建一个新的比较器,将其存储在变量c中,并将其传递给sort方法。

    第一段代码尝试将一个新的比较器分配给变量c并将其传递给方法sort,java的语法不允许这样做。拥有一个以一个整数为参数的方法并编写foo(intbar=7)是一件很好的事情。这不太有道理。

        2
  •  2
  •   Andrei Dumitrescu-Tudor    7 年前

    希望这有帮助:)

        3
  •  2
  •   Andy Turner    7 年前

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

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

    如果您想声明一个变量来保存该比较器,并在排序调用中分配它,您可以如下所示:

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

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