web-dev-qa-db-ja.com

共変戻り型とは何ですか?

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

93
Pops

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

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

130
Andrzej Doyle

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

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()メソッドの戻り値の型は共変の戻り値の型として知られています。

33
Mohamed ALOUANE

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

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

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

6
PresidentPratik

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();
  }

}
6
Dhiraj

共変の戻り値の型は、戻り値の型がサブクラスと同じ方向に変化する可能性があることを指定します

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以降、

サブクラスが戻り型が非プリミティブのメソッドをオーバーライドするが、戻り型をサブクラス型に変更する場合、戻り型を変更してメソッドをオーバーライドすることができます。

1
Keshav Gera
  • クラス階層に存在する混乱した型キャストを回避し、コードを読みやすく、使いやすく、保守しやすくするのに役立ちます。
  • オーバーライドするときに、より具体的な戻り値の型を持つ自由が得られます
    メソッド。

  • 返品時のランタイムClassCastExceptionsの防止に役立ちます

参照:www.geeksforgeeks.org

1
Arun Raaj
  • 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;
    }
}
0
snr

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

0
user11198642