質問

う共変戻り値の型を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()するDogFoodFoodメソッドの戻り型を変更することが可能です

@Override
protected DogFood seekFood() {

    return new DogFood();
}

これは完全に合法オーバーライドだ、とDogseekFood()メソッドの戻り値の型は、を共変戻り値の型のとして知られています。

JDK 1.5のリリースから、共変の型は、Javaで導入されました。我々は関数は、それが行動のだを変更することが許可されている関数をオーバーライドする場合それはあなたの本のほとんどで読むために何を得るのですが、どのようなの:と私は単純なケースであなたにそれを説明します彼ら{著者}は、我々はあまりにも戻り値の型を変更することができるということですを逃します。 私たちがいる限り、方法の基本バージョンの型を返すために割り当てることができるよう戻り値の型を変更することができます明確化のためのリンクの下に確認してください。

派生型を返すのこの機能は、共変と呼ばれているので...

は、メソッドが戻り値の型が異なる上書きすることはできますか?

共変戻り値の型は、単純に自分のクラス参照またはその子クラスの参照を返すことを意味します。

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ので、サブクラスは、その戻り値の型が非プリミティブであるが、それは、サブクラスタイプにその戻り値の型を変更する任意のメソッドをオーバーライドした場合、戻り値の型を変更することで、メソッドをオーバーライドすることが可能である。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top