You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java Comparator语法疑问:匿名内部类实现接口并实例化原理

关于匿名内部类实现接口并作为参数的解释

这是个非常好的问题!你看到的这种写法是Java里的匿名内部类,它就是专门用来快速创建接口(或抽象类)实例的语法技巧,咱们一步步拆解它的运作逻辑:

  • 首先明确:接口本身确实不能直接new出来,但Java允许我们在需要接口对象的地方,直接定义一个没有类名的临时类来实现这个接口,同时立刻创建这个类的实例。
  • 你代码里的new Comparator<String>() { @Override public int compare(String a, String b) { return counts.get(b) - counts.get(a); } } 其实完成了三件事:
    1. 悄悄定义了一个匿名的类,这个类实现了Comparator<String>接口
    2. 在这个匿名类里重写了compare方法,实现了你需要的“按counts映射值降序排序”的逻辑
    3. 直接创建了这个匿名类的一个对象,把它作为参数传给PriorityQueue的构造方法
  • 为什么能作为参数传递?因为PriorityQueue的构造方法要求的参数类型是Comparator<? super E>,而我们创建的这个匿名内部类实例,正是实现了该接口的对象,完全符合参数类型要求,所以可以直接传递进去。

另外补充个小知识点:在Java 8及更高版本里,这种匿名内部类写法可以用Lambda表达式简化,效果完全一样,代码会更简洁:

PriorityQueue<String> pq = new PriorityQueue<>((a, b) -> counts.get(b) - counts.get(a));

内容的提问来源于stack exchange,提问作者mzoz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:18:24