Co to jest kowariantny typ zwracany w Javie? W ogóle w programowaniu obiektowym?
java
oop
covariance
Wyskakuje
źródło
źródło
Odpowiedzi:
Zwrot kowariantny oznacza, że w przypadku przesłaniania metody zwracany typ metody zastępującej może być podtypem typu zwracanego metody zastępowanej.
Aby wyjaśnić to na przykładzie, typowym przypadkiem jest
Object.clone()
- który jest zadeklarowany w celu zwrócenia typuObject
. Możesz to zmienić we własnej klasie w następujący sposób:Zaletą jest to, że każda metoda, która zawiera jawne odwołanie do obiektu MyFoo, będzie mogła wywołać
clone()
i wiedzieć (bez rzutowania), że zwracana wartość jest instancjąMyFoo
. Bez kowariantnych typów zwracanych, zastąpiona metoda w MyFoo musiałaby zostać zadeklarowana jako zwracającaObject
- a więc wywołanie kodu musiałoby jawnie obniżyć wynik wywołania metody (nawet jeśli obie strony "wiedzą", że zawsze może to być tylko instancja MyFoo ).Zauważ, że nie ma w tym nic specjalnego
clone()
i że każda nadpisana metoda może mieć kowariantny zwrot - użyłem jej jako przykładu tutaj, ponieważ jest to standardowa metoda, w której jest to często przydatne.źródło
List<Foo>
iList<FooBar>
?clone()
jako bycie aMethod<Void, Object>
i zapytać, czy bardziej szczegółoweMethod<Void, MyFoo>
można przypisać do tego typu nadrzędnego. Co tak jest, wtedy i tylko wtedy, gdy metody Java są kowariantne w zwracanym typie.Oto kolejny prosty przykład:
Animal
klasaDog
klasaJest możliwe, aby zmienić typ powrotnego ruchu
Dog
jestseekFood()
metodą doDogFood
- podklasyFood
, jak pokazano poniżej:To doskonale nadrzędnym prawnej i rodzaju powrót
Dog
„sseekFood()
metoda jest znana jako kowariantna typ zwracany .źródło
Od wydania JDK 1.5 typy kowariantne zostały wprowadzone w Javie. i wyjaśnię ci to w prostym przypadku: Kiedy nadpisujemy funkcję, funkcja może wprowadzać zmiany w jej zachowaniu , właśnie to czytasz w większości książek, ale to, czego {autorzy} przegapiają polega na tym, że możemy również zmienić typ zwracanej wartości. sprawdź poniższy link dla wyjaśnienia, możemy zmienić typ zwracania, o ile można go przypisać do typu zwracanego wersji podstawowej metody.
Więc ta funkcja zwracania typów pochodnych nazywa się KOWARIANT ...
Czy metody przesłonięte mogą różnić się typem zwracania?
źródło
kowariantne Zwracane typy oznaczają po prostu zwrócenie własnego odwołania do klasy lub odwołania do klasy potomnej.
źródło
Parent.foo()
zwraca niepowiązany typA
iChild.foo()
zwraca typB
pochodzący zA
.Aby dodać do powyższych odpowiedzi, przesłonięcie jest możliwe wśród wspólnych typów zwracanych, z zastrzeżeniem, że typ zwracany metody przesłaniającej (metoda podklasy) powinien być podklasą typu zwracanego metody przesłoniętej (metoda nadrzędnej). Jest to ważne od wersji Java 5.
źródło
Kowariantny typ zwrotu określa, że typ zwracany może różnić się w tym samym kierunku co podklasa
Przed wersją Java 5 nie można było przesłonić żadnej metody poprzez zmianę zwracanego typu. Ale teraz, odkąd Java5,
możliwe jest przesłonięcie metody poprzez zmianę zwracanego typu, jeśli podklasa przesłania jakąkolwiek metodę, której typem zwracanym jest Non-Primitive, ale zmienia typ zwracany na typ podklasy.
źródło
Podczas nadpisywania
metod możemy mieć bardziej szczegółowe typy zwracane .
Pomoc w zapobieganiu wyjątkom ClassCastExceptions w czasie wykonywania zwrotów
źródło: www.geeksforgeeks.org
źródło
UnaryOperator.java
Function.java
źródło
Przed wersją Java 5 nie można było przesłonić żadnej metody przez zmianę zwracanego typu. Ale teraz, od wersji Java5, możliwe jest przesłonięcie metody poprzez zmianę zwracanego typu, jeśli podklasa przesłania jakąkolwiek metodę, której typem zwracanym jest Non-Primitive, ale zmienia typ zwracany na typ podklasy.
źródło