在排序方法中使用匿名 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>() { ... });
但我怀疑这不是你想要的。
为什么如果我在 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>() { ... });
但我怀疑这不是你想要的。