为什么我在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
}
为什么会发生?
非常感谢!
答案 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>() { ... });
但是我怀疑那不是你想要的。