Javaの共変戻り型とは何ですか?一般にオブジェクト指向プログラミングでは?
共変の戻り値は、メソッドをオーバーライドするときに、オーバーライドするメソッドの戻り値の型がオーバーライドされるメソッドの戻り値の型のサブタイプになることを意味します。
これを例で明確にするために、一般的なケースは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と呼ばれます...
covariantの戻り値の型は、単に自身のクラス参照またはその子クラス参照を返すことを意味します。
class Parent {
//it contain data member and data method
}
class Child extends Parent {
//it contain data member and data method
//covariant return
public Parent methodName() {
return new Parent();
or
return Child();
}
}
共変の戻り値の型は、戻り値の型がサブクラスと同じ方向に変化する可能性があることを指定します
class One{
One get(){return this;}
}
class Two extends One{
Two get(){return this;}
void message(){
System.out.println("After Java5 welcome to covariant return type");
}
public static void main(String args[]){
new Two().get().message();
}
}
Java 5の前は、戻り値の型を変更してメソッドをオーバーライドすることはできませんでした。しかし、Java5以降、
サブクラスが戻り型が非プリミティブのメソッドをオーバーライドするが、戻り型をサブクラス型に変更する場合、戻り型を変更してメソッドをオーバーライドすることができます。
オーバーライドするときに、より具体的な戻り値の型を持つ自由が得られます
メソッド。
返品時のランタイムClassCastExceptionsの防止に役立ちます
参照:www.geeksforgeeks.org
- Javaの共変の戻り値型により、オーバーライドされたメソッドの戻り値の型を絞り込むことができます。
- この機能は、クライアント側でのダウンキャストを回避するのに役立ちます。これにより、プログラマは型チェックやダウンキャストを必要とせずにプログラミングできます。
- 共変の戻り値の型は、常に非プリミティブな戻り値の型に対してのみ機能します。
interface Interviewer {
default Object submitInterviewStatus() {
System.out.println("Interviewer:Accept");
return "Interviewer:Accept";
}
}
class Manager implements Interviewer {
@Override
public String submitInterviewStatus() {
System.out.println("Manager:Accept");
return "Manager:Accept";
}
}
class Project {
public static void main(String args[]) {
Interviewer interviewer = new Manager();
interviewer.submitInterviewStatus();
Manager mgr = new Manager();
mgr.submitInterviewStatus();
}
}
他の例はJavaからのものです。
UnaryOperator.Java
@FunctionalInterface
public interface UnaryOperator<T> extends Function<T, T> {
/**
* Returns a unary operator that always returns its input argument.
*
* @param <T> the type of the input and output of the operator
* @return a unary operator that always returns its input argument
*/
static <T> UnaryOperator<T> identity() {
return t -> t;
}
}
Function.Java
@FunctionalInterface
public interface Function<T, R> {
........
........
........
........
static <T> Function<T, T> identity() {
return t -> t;
}
}
Java5より前は、戻り値の型を変更してメソッドをオーバーライドすることはできませんでした。しかし、Java5以降、サブクラスが非プリミティブ型のメソッドをオーバーライドする場合に戻り型を変更することでメソッドをオーバーライドできますが、戻り型をサブクラス型に変更します。