Javaの共変戻り型とは何ですか? 一般的にオブジェクト指向プログラミングでは?
9 に答える
共変の戻り値とは、メソッドをオーバーライドするときに、オーバーライドするメソッドの戻り値の型を、オーバーライドされたメソッドの戻り値の型のサブタイプにすることができることを意味します。
例でこれを明確にするために、一般的なケースはObject.clone()
- で、型を返すように宣言されていObject
ます。次のように、独自のクラスでこれをオーバーライドできます。
public class MyFoo
{
...
// Note covariant return here, method does not just return Object
public MyFoo clone()
{
// Implementation
}
}
ここでの利点は、MyFoo オブジェクトへの明示的な参照を保持するすべてのメソッドを呼び出しclone()
て、戻り値が のインスタンスであることを (キャストせずに) 認識できることですMyFoo
。共変の戻り値の型がなければ、MyFoo でオーバーライドされたメソッドを返すように宣言する必要があります。Object
そのため、呼び出し元のコードは、メソッド呼び出しの結果を明示的にダウンキャストする必要があります (両側が MyFoo のインスタンスにしかならないことを「知っている」とはいえ)。 )。
特別なことは何もなくclone()
、オーバーライドされたメソッドは共変の戻り値を持つことができることに注意してください。ここでは、これがしばしば役立つ標準的なメソッドであるため、例として使用しました。
別の簡単な例を次に示します。
Animal
クラス
public class Animal {
protected Food seekFood() {
return new Food();
}
}
Dog
クラス
public class Dog extends Animal {
@Override
protected Food seekFood() {
return new DogFood();
}
}
以下に示すように、Dog
のseekFood()
メソッドの戻り値の型を のDogFood
サブクラスに変更することができます。Food
@Override
protected DogFood seekFood() {
return new DogFood();
}
これは完全に正当なオーバーライドであり、Dog
のseekFood()
メソッドの戻り値の型は共変の戻り値の型として知られています。
JDK 1.5 のリリースから、共変型が Java に導入されました。簡単なケースで説明します:関数をオーバーライドすると、関数はその動作に変更を加えることができます。これは、ほとんどの本で読むことができますが、{著者}が見逃していることです。戻り値の型も変更できるということです。メソッドの基本バージョンの戻り値の型に割り当てることができる限り、戻り値の型を変更できることを明確にするために、以下のリンクを確認してください。
したがって、派生型を返すこの機能は COVARIANT と呼ばれます...
上記の回答に加えて、オーバーライドするメソッド (サブクラス メソッド) の戻り値の型は、オーバーライドされたメソッド (スーパークラス メソッド) の戻り値の型のサブクラスでなければならないという制約付きで、共変の戻り値の型間でオーバーライドが可能です。これは Java 5 以降で有効です。
Java5 より前は、戻り値の型を変更してメソッドをオーバーライドすることはできませんでした。しかし、Java5以降、サブクラスが戻り値の型が非プリミティブであるメソッドをオーバーライドし、戻り値の型をサブクラス型に変更する場合、戻り値の型を変更してメソッドをオーバーライドすることができます。