我很想知道equals
中AbstractSet
方法将对象o
转换为Collection
而不是Set
的原因。如果它转换为Set
,考虑到Set
的所有实现类直接或间接地从AbstractCollection
继承,它将没有任何区别。这有什么具体原因吗? Link
答案 0 :(得分:2)
假设没有语义差异,你是正确的。在演员表而不是Collection
中使用Set
可能是由于使用最不具体类型的原则 - 与您在Set<Foo> fooSet = new HashSet<>();
等声明中看到的原则相同。只需要来自Collection
的方法,因此我们会转换为Collection
。但是,这是一个无法实现的细节,并未由JLS定义。
(已删除的问题)接口仅表明在所有实现中都应存在某些行为(方法)。如果一个类扩展了一个提供此行为以及实现接口的抽象类,那么这很好,因为该类具有所需的行为。它的实际实现源自抽象类。