はい、Javaはあなただけのオリジナルのクラスをエイリアシングのために非final
具象クラスをサブクラス化できるようになります。
デフォルトコンストラクタが
Foo
でしかないと仮定して、最小限の実装だろう
public class Foo { /* implementation */ }
public class Bar extends Foo {}
。 Foo
で引数を取るコンストラクタがある場合、あなたはあなたのBar
インスタンス、例えばを作成するために呼び出す予定のすべてのコンストラクタのためBar
にコンストラクタを提供する必要があります。
public class Foo {
public Foo(String baz) { /* constructor implementation */ }
}
public class Bar extends Foo {
public Bar(String baz) { super(baz); }
}
Foo
のすべての非private
メソッドを継承しますby Bar
。
汎用タイプのパラメータとしてFoo
の代わりにBar
を使用する予定がある場合のみです。例えば
あなたはList<Bar>
とList<Foo>
を交換した場合、その後、あなたのList
はもはやFoo
を拡張する可能性のあるFoo
インスタンス、または他のクラスのインスタンスを保持することはできません。 Javaのジェネリックは不変であるため、
はさらに、List<Bar>
はBar
がFoo
場合でも、List<Foo>
のサブタイプではありません。そのような場合の詳細については、Is List a subclass of List? Why aren't Java's generics implicitly polymorphic?を参照してください。また、List<? extends Foo>
を使用すると、List<Foo>
またはList<Bar>
を使用できますが、null
以外のものはadd
にできません。
あなたはジェネリックでは使用しないと述べていますが、要件が拡張されている場合は注意が必要です。
結局のところ、Javaコンパイラはあなたにそれをさせますが、限定された逆さまで、Foo
の代わりにBar
をエイリアスとして使用すると、潜在的な欠点として、このエイリアシングプロセスを使用する理由はありません。
コンストラクタに注意する必要があると思いますが、親が抽象クラスでない限り、親クラスのメソッドをオーバーライドする義務はありません。 – KevinO
ジェネリック型のパラメータとして 'Foo'や' Bar'を使用しますか? 'リスト'? –
rgettman
@rgettman漸進的リファクタのエイリアスではありません – mfrankli