件名の一般的な質問の実用的な例として、インターフェイスにcontainsAll
メソッドを実装したいと思いますSet
public boolean containsAll(Iterable<?> c) { /* ... */ }
これは、インターフェース要件をカバーすることをCollection
意味Iterable
するため、許可する必要があると思います。containsAll
同様に、より一般的には、引数のスーパークラスを使用してインターフェイスを実装できるようにすることも機能するはずです。
しかし、Eclipseはそうは言いません(javacをまっすぐに試したことはありません)-誰かがその理由を説明できますか? 仕様にはそれをそのままにしている何かがあると確信していますが、要件の動機も理解したいと思います。Iterable<?>
または、のスーパークラスではないなどの何かが欠けていCollection<?>
ますか?
副次的な質問として、2 つのメソッドを宣言しているとすれば、引数Iterable
を使用した呼び出しでは常に署名付きのメソッドが優先されますか?Collection
日食エラー:
Collection
署名付きのメソッドを削除して、 Iterable
1 つだけ残すと (エラーの後に参照)、次のようになります。
The type BitPowerSet must implement the inherited abstract method Set<Long>.containsAll(Collection<?>)
正確な実装は次のとおりです。
@Override public boolean containsAll(Collection<?> c) {
for (Object o : c) if (!contains(o)) return false;
return true;
}
public boolean containsAll(Iterable<?> c) {
for (Object o : c) if (!contains(o)) return false;
return true;
}