Java Comparator语法疑问:匿名内部类实现接口并实例化原理
关于匿名内部类实现接口并作为参数的解释
这是个非常好的问题!你看到的这种写法是Java里的匿名内部类,它就是专门用来快速创建接口(或抽象类)实例的语法技巧,咱们一步步拆解它的运作逻辑:
- 首先明确:接口本身确实不能直接
new出来,但Java允许我们在需要接口对象的地方,直接定义一个没有类名的临时类来实现这个接口,同时立刻创建这个类的实例。 - 你代码里的
new Comparator<String>() { @Override public int compare(String a, String b) { return counts.get(b) - counts.get(a); } }其实完成了三件事:- 悄悄定义了一个匿名的类,这个类实现了
Comparator<String>接口 - 在这个匿名类里重写了
compare方法,实现了你需要的“按counts映射值降序排序”的逻辑 - 直接创建了这个匿名类的一个对象,把它作为参数传给
PriorityQueue的构造方法
- 悄悄定义了一个匿名的类,这个类实现了
- 为什么能作为参数传递?因为
PriorityQueue的构造方法要求的参数类型是Comparator<? super E>,而我们创建的这个匿名内部类实例,正是实现了该接口的对象,完全符合参数类型要求,所以可以直接传递进去。
另外补充个小知识点:在Java 8及更高版本里,这种匿名内部类写法可以用Lambda表达式简化,效果完全一样,代码会更简洁:
PriorityQueue<String> pq = new PriorityQueue<>((a, b) -> counts.get(b) - counts.get(a));
内容的提问来源于stack exchange,提问作者mzoz
相关产品推荐
相关产品推荐

