我知道接口不能有构造函数,我们不能创建接口对象。
这是不可能的:
Comparator cmp = new Comparator();
我不明白如何使用关键字" new Comparator()"创建一个匿名内部类。这个关键字没有创建Comparator类型的对象吗?
以下是完整的代码:
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class DemoApp {
public static void main(String args[]) {
List<String> animals = new ArrayList<>();
animals.add("elephant");
animals.add("snake");
animals.add("lion");
animals.add("mangoose");
animals.add("cat");
animals.add("tiger");
Collections.sort(animals, new Comparator<String>() {
public int compare(String s1, String s2) {
return -s1.compareTo(s2);
}
});
displayList(animals);
}
public static void displayList(List<String> anim) {
for (String animal : anim) {
System.out.print(animal + " ");
}
System.out.println();
}
}
答案 0 :(得分:10)
此关键字是否会创建Comparator类型的对象?
是的,但它没有创建类Comparator
的实例(因为Comparator
不是类)。
它创建一个实现Comparator
接口的匿名类的实例。由于该类实例实现了Comparator
,因此可以说它的类型为Comparator
。
答案 1 :(得分:4)
当你写这样的表达时:
Collections.sort(animals, new Comparator<String>() {
public int compare(String s1, String s2) {
return -s1.compareTo(s2);
}
});
你真正做的是:
class ClassNameHere implements Comparator<String> {
public int compare(String s1, String s2) {
return -s1.compareTo(s2);
}
}
Collections.sort(animals, new ClassNameHere());
此代码不起作用:
Comparator comp = new Comparator();
因为,如您所知,您无法实例化接口。在前面的两段代码中,您没有实例化一个接口,而是实例化一个类,这没关系。
你很困惑,因为你写的代码是我写的代码的简写,但它实际上是同样的东西。
答案 2 :(得分:-2)
您可以像这样创建Compartor
(就像您一样)
Comparator cmp = new Comparator<String>() {
public int compare(String s1, String s2) {
return -s1.compareTo(s2);
}
};
你只需要实现它的函数compare
,因为它是一个抽象类
在这种情况下,您的实例为Compartor
System.out.println(cmp.getClass().getName()); //anonymous class
System.out.println(Comparator.class.isInstance(cmp));
输出
MyClass$1
true
答案 3 :(得分:-2)
匿名类是一个没有名称的内部类,并且只创建了一个对象,因此这里创建的对象是一个实现Comparator
的anoymous类的实例。