Java中比较器接口的构造函数

时间:2018-04-20 08:44:00

标签: java collections constructor interface

我知道接口不能有构造函数,我们不能创建接口对象。

这是不可能的:

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();
    }
 }

4 个答案:

答案 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类的实例。