次の図で、AbstractPainterは を実装する抽象クラスIPainterです。ContemporaryPainterとPastPainterは、 を拡張するクラスですAbstractPainter。これを考慮して、?PastPainterをAbstractPainter拡張します。IPainterそれとも拡張するだけAbstractPainterですか?
ありがとう!
次の図で、AbstractPainterは を実装する抽象クラスIPainterです。ContemporaryPainterとPastPainterは、 を拡張するクラスですAbstractPainter。これを考慮して、?PastPainterをAbstractPainter拡張します。IPainterそれとも拡張するだけAbstractPainterですか?
ありがとう!
それらは拡張するだけAbstractPainterです。彼らは実装しIPainterます。だからあなたはできる
IPainter painter = new PastPainter();
AbstractPainter otherPainter = new ContemporaryPainter();
そして、それはまだ有効です。
ただし、コレクションでそれらを参照する場合は、
List<? extends IPainter> list = new ...
それはまだ「拡張」という言葉を使用しています。ただし、それを「インターフェースの拡張」とは呼びません。
唯一の「インターフェースを拡張する」のは、次のスニペットのようなものを作成した場合です。
public interface IPolymath extends IPainter {
List<String> getOtherProfessions();
}
他のインターフェイスが元のインターフェイスを拡張する場所。
はいPastPainter、実装する拡張機能があるためContemporaryPainter、タイプです。IPainterAbstractPainterIPainter
ClassA例:実装または拡張のいずれかを想定しますClassB。そして、ClassCextends/implementsの場合はClassA自動的ClassCにのタイプでもありClassBます。
すべてのサブクラスは、そのスーパークラスと同じタイプであり、そのスーパークラスが継承されているタイプでもあります。
Java では、抽象クラスを拡張してインターフェースを実装するというのが正しい考え方です。
たとえば、 aはインターフェイスと をLinkedList実装します。ListAbstractSequentialList