我们知道,如果我们想创建一个类的对象,就必须实现接口的所有方法。但是为什么不需要在java中同时实现接口Comparator
的compare()
和equals()
?
我同意目的已经解决了,但即使如此,如果我们重写比较
(),为什么不强制重写等于
()?
每个对象隐式地有一个equals from对象(因为每个对象都是对象的一个子类型),由于它是一个虚拟方法,标准Java多态性接管了它。
现在,Comparator#equals
施加了额外的限制,这就是为什么它被指定为接口的一部分。
…仅当指定的对象也是比较器并且它施加与此比较器相同的顺序时,此方法才能返回true。
但是,由于coverse必须为true,因此不重载equals
并不能打破新的要求。
请注意,不重写对象始终是安全的。等于(对象)。。[因此,不同的比较器实例永远不会相等]。
因为它已经被覆盖java.lang.Object
在您可以创建的每个对象上。
因为所有类都隐式地扩展了Object
,所以每个Compator
的实现都有一个equals方法,因为每个Object
都有一个。
如果使用toString()方法定义接口,情况也是一样的。
public interface ToString {
public String toString();
}
public class SomeClass implements ToString {
// toString implicitly implemented, because Object defines it
}
当你看这个类时,它说“实现ToString”,这是真的,不是吗?
今天,我试图学习Java8中的一些特性,特别是关于Lambda表达式。我创建了一个新的Comaparator,如下所示: 当我阅读比较器接口内的代码时,我感到困惑。虽然通过接口比较器有两个方法compare()和equals(),但我们不需要全部实现它们。我已经找到了一些原因,为什么我们不需要在这里实现方法equals()。但我也读过javadocs 如果类声明实现接口,则该接口定义的所有方法必须
为什么在实现Comparator接口时不需要重写equals()方法?comparator中的equals()既不是静态的,也不是默认的。 在同一行中,我还想问,当Comparator有两个抽象方法compare()和equals()时,它是如何作为一个函数接口的?
我是java新手,试图理解一些概念。这是一段我不懂的代码。 我知道这是怎么回事,但不明白为什么这是允许的。因此,我的问题是: 从java文档中,比较器[T]是一个接口。比较器[水果]怎么样?我将假设它是一个类,因为它必须覆盖比较函数。 为什么可以在{}中使用非参数构造函数和类定义来初始化FruitName比较器?我在比较器[T]的javadoc中没有找到这样的构造函数声明。 如有任何意见,将不胜感
接口在Java11中获得了一个新的静态方法:。 此方法返回int: 如果两个字符序列相等,则值为0;如果第一个字符序列在词典编纂上小于第二个字符序列,则为负整数;或者,如果第一个字符序列在词典上大于第二个字符序列,则为正整数。 这听起来就像是可比的。然而,Java团队显然选择了不让CharSequence可比。为什么不呢?我无法理解这种逻辑。 什么是关于,这将不是一个适当的适合?
输出为"A的静态方法"。因此静态方法不会被重写,否则输出将是“静态方法B”。JVM如何在运行时决定调用类A而不是B的静态方法。
我有一个关于比较器接口的问题。在我的类下面实现了按长度而不是按字符值排序的默认排序的接口。 覆盖默认比较后,我使用对我的字符串数组进行排序。即使我覆盖了默认方法,如果我使用Arrays.sort,它会调用默认比较而不是我覆盖的方法。这是因为我显式调用了超类方法吗? 另一个问题是初始化接口本身。我知道您不能初始化接口,而是初始化一个类对象(实现所述接口)来引用接口可用的方法。在这种情况下,当我初始化