为什么在java.util.Comparator中实现equals不是必须的?
无论是在Javadoc中还是在代码本身中,Comparator接口都定义了:
int compare(T o1, T o2); boolean equals(Object obj);
但是这不会给probs编译:
Comparator a = new Comparator() { @Override public int compare(Object o1, Object o2) { //.. } };
但这样做:
Comparator a = new Comparator() { @Override public boolean equals(Object comparator) { //.. } };
它是如何为接口完成的,允许我们不要覆盖方法?
首先, JavaDocs清楚地解释了你应该实现这个方法:
此外,仅当指定的对象也是比较器并且它与此比较器施加相同的顺序时,此方法才能返回true。 因此,
comp1.equals(comp2)
意味着每个对象引用o1
和o2
sgn(comp1.compare(o1, o2))==sgn(comp2.compare(o1, o2))
。
但后来:
请注意,不要覆盖
Object.equals(Object)
始终是安全的。
怎么可能不覆盖equals()
,即使它是接口的一部分? 因为已经为Java 中的每个对象( 在Object
类中 )实现了此方法。
接口中的声明只是通过添加额外的JavaDoc解释来强调equals()
对Comparator
的重要性。
顺便说一句,如果你的比较器是无状态的,你应该只有一个实例 – 在这种情况下,默认的equal()
实现就好了。
因为每个对象都已经实现了equals()。
实际上,在Comparator接口定义中再次指定equals()除了有机会记录合同及其与compareTo()的关系之外,完全没有任何结果。
- 类加载应用程序上下文Spring
- 运行一个jar子两次
- Springboot 1.5.x的速度
- Jtable行跨度和列跨度
- 如何在Eclipse之外的项目中使用java Eclipse Abstract Syntax Tree? (即不是eclipse插件)
- 为什么我的applet得到java.security.AccessControlException:访问被拒绝(java.net.SocketPermission …),我该如何避免它?
- 更改HttpServletResponse的编码
- UUID.randomUUID()是否适合用作一次性密码?
- 有没有简洁的方法为Google Guava中的InputStream创建InputSupplier?