116

Javaの共変戻り型とは何ですか? 一般的にオブジェクト指向プログラミングでは?

4

9 に答える 9

152

共変の戻り値とは、メソッドをオーバーライドするときに、オーバーライドするメソッドの戻り値の型を、オーバーライドされたメソッドの戻り値の型のサブタイプにすることができることを意味します。

例でこれを明確にするために、一般的なケースは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()、オーバーライドされたメソッドは共変の戻り値を持つことができることに注意してください。ここでは、これがしばしば役立つ標準的なメソッドであるため、例として使用しました。

于 2009-12-10T17:24:12.803 に答える
45

別の簡単な例を次に示します。

Animalクラス

public class Animal {

    protected Food seekFood() {

        return new Food();
    }
}

Dogクラス

public class Dog extends Animal {

    @Override
    protected Food seekFood() {

        return new DogFood();
    }
}

以下に示すように、DogseekFood()メソッドの戻り値の型を のDogFoodサブクラスに変更することができます。Food

@Override
protected DogFood seekFood() {

    return new DogFood();
}

これは完全に正当なオーバーライドであり、DogseekFood()メソッドの戻り値の型は共変の戻り値の型として知られています。

于 2015-09-14T19:36:34.497 に答える
10

JDK 1.5 のリリースから、共変型が Java に導入されました。簡単なケースで説明します:関数をオーバーライドすると、関数はその動作に変更を加えることができます。これは、ほとんどの本で読むことができますが、{著者}が見逃していることです。戻り値の型も変更できるということです。メソッドの基本バージョンの戻り値の型に割り当てることができる限り、戻り値の型を変更できることを明確にするために、以下のリンクを確認してください。

したがって、派生型を返すこの機能は COVARIANT と呼ばれます...

オーバーライドされたメソッドは戻り値の型が異なる可能性がありますか?

于 2014-03-19T07:46:32.607 に答える
2

上記の回答に加えて、オーバーライドするメソッド (サブクラス メソッド) の戻り値の型は、オーバーライドされたメソッド (スーパークラス メソッド) の戻り値の型のサブクラスでなければならないという制約付きで、共変の戻り値の型間でオーバーライドが可能です。これは Java 5 以降で有効です。

于 2019-10-26T17:53:05.083 に答える
0

Java5 より前は、戻り値の型を変更してメソッドをオーバーライドすることはできませんでした。しかし、Java5以降、サブクラスが戻り値の型が非プリミティブであるメソッドをオーバーライドし、戻り値の型をサブクラス型に変更する場合、戻り値の型を変更してメソッドをオーバーライドすることができます。

于 2019-03-13T17:45:36.957 に答える