Che cosa è un covariante tipo di ritorno?
-
18-09-2019 - |
Domanda
Che cosa è un covariante tipo di ritorno in Java?Nella programmazione orientata agli oggetti in generale?
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...
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.