Domanda

Che cosa è un covariante tipo di ritorno in Java?Nella programmazione orientata agli oggetti in generale?

È stato utile?

Soluzione

ritorno covariante, significa che quando si sostituisce un metodo, il tipo di ritorno del metodo prevalente è permesso di essere un sottotipo del tipo di ritorno del metodo override.

Per chiarire con un esempio, un caso comune è Object.clone() - che è dichiarato per restituire un tipo di Object. Si potrebbe sovrascrivere questo nella vostra classe come segue:

public class MyFoo
{

   ...

   // Note covariant return here, method does not just return Object
   public MyFoo clone()
   {
       // Implementation
   }
}

Il vantaggio è che qualsiasi metodo che detiene un esplicito riferimento a un oggetto MyFoo potrà invocare clone() e conoscere (senza casting) che il valore restituito è un'istanza di MyFoo. Senza tipi restituiti covarianti, il metodo sottoposto a override in MyFoo avrebbe dovuto essere dichiarato per tornare Object - e così codice chiamante avrebbe dovuto bassi in modo esplicito il risultato della chiamata al metodo (anche pensato entrambe le parti "sapere" può essere solo un caso di MyFoo).

Si noti che non c'è niente di speciale in clone() e che qualsiasi metodo override può avere un ritorno covariante -. L'ho usato come esempio qui come si tratta di un metodo standard in cui questo è spesso utile

Altri suggerimenti

Ecco un altro semplice esempio:

class Animal

public class Animal {

    protected Food seekFood() {

        return new Food();
    }
}

class Dog

public class Dog extends Animal {

    @Override
    protected Food seekFood() {

        return new DogFood();
    }
}

E 'possibile modificare il tipo di ritorno del metodo Dog del seekFood() per DogFood - una sottoclasse di Food, come illustrato di seguito:

@Override
protected DogFood seekFood() {

    return new DogFood();
}

Questo è perfettamente un imperativo legale, e il tipo di ritorno del metodo di Dog di seekFood() è conosciuto come tipo di ritorno covariante .

Dalla versione di JDK 1.5, covariante tipi sono state introdotte in Java.e io ti spiego con un semplice caso : Quando si esegue l'override di un funzione la funzione è consentito apportare modifiche al comportamento che è che cosa ottenete per leggere la maggior parte dei libri, ma quello che { autori } perdere è che possiamo cambiare il tipo di ritorno troppo.controllare il link qui sotto per avere chiarimenti possiamo cambiare il tipo di ritorno e per quanto possa essere assegnato al tipo di ritorno della versione Base del metodo.

Questa funzione di ritorno tipi derivati è chiamato COVARIANTE...

Può l'override di metodi differiscono nel tipo di ritorno?

tipi restituiti covarianti significa semplicemente tornare proprio riferimento di classe o il suo riferimento classe figlia.

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

}

covariante tipo restituito specifica che il tipo di ritorno può variare nella stessa direzione della sottoclasse

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

Prima di Java 5, non è stato possibile esclusione qualsiasi metodo cambiando il tipo di ritorno. Ma ora, dal momento che Java5,

è possibile sovrascrivere metodo cambiando il tipo di ritorno se sottoclasse sovrascrive qualsiasi metodo il cui tipo restituito è non primitive ma cambia il suo tipo di ritorno di tipo sottoclasse.

  • E 'aiuta ad evitare il tipo di confusione calchi presente nella gerarchia di classe e rendendo il codice leggibile, utilizzabile e gestibile.
  • ottenere una libertà di avere tipi restituiti più specifici quando l'override
    metodi.

  • Aiuto nella prevenzione ClassCastExceptions run-time sui rendimenti

di riferimento: www.geeksforgeeks.org

  
      
  • Il tipo restituito covariante in Java, che permette restringendo tipo di ritorno   del metodo override.
  •   
  • Questa funzione vi aiuterà ad evitare giù fusione   sul lato client. Permette programmatore di programma senza che occorra   di controllo del tipo e colata giù.
  •   
  • Il tipo restituito covariante sempre   funziona solo per i tipi di ritorno non primitive.
  •   
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();
    }
}
  

Altro esempio è da 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;
    }
}

Prima Java5, non è stato possibile eseguire l'override qualsiasi metodo cambiando il tipo di ritorno. Ma ora, dal momento che Java5, è possibile sovrascrivere il metodo cambiando il tipo di ritorno, se sottoclasse sostituisce qualsiasi metodo il cui ritorno è di tipo non primitive, ma cambia il suo tipo di ritorno di tipo sottoclasse.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top