logo

Kowariantne typy zwrotów w Javie

Gdy ucho uderza w bębenki, szybko dowiadujemy się, że można to zrobić albo za pomocą różnych typów danych, albo argumentów przekazywanych do funkcji, czego programista nauczył się początkowo podczas nauki polimorfizm w Javie.  Przed JDK 5.0 nie było to możliwe prześcigać metodę poprzez zmianę typu zwracanego wyniku. Kiedy zastępujemy metodę klasy nadrzędnej, typy argumentów nazwy i typ zwracany przez metodę przesłaniającą w klasie potomnej muszą być dokładnie takie same, jak w przypadku metody klasy nadrzędnej. Mówiono, że metodą nadrzędną jest niezmienny pod względem typu zwrotu. 

Od wersji Java 5.0 i nowszych możliwe jest posiadanie różnych typów zwracanych metod przesłaniających w klasie podrzędnej, ale typ zwracany przez element podrzędny powinien być podtypem typu zwracanego przez element nadrzędny. Metoda nadrzędna staje się wariant pod względem typu zwrotu.
Współwariantowy typ zwrotu jest oparty na Zasada podstawienia Liskowa .

Teraz, maniacy, musicie się zastanawiać, po co używać, dla którego będziemy wymieniać zalety w następujący sposób:



  • Pomaga to uniknąć mylących rzutowań typów obecnych w hierarchii klas, dzięki czemu kod jest czytelny i łatwy w utrzymaniu.
  • Podczas zastępowania metod możemy mieć bardziej szczegółowe typy zwrotów.
  • Pomoc w zapobieganiu wyjątkom ClassCastException w czasie wykonywania przy zwrotach

Notatka: Jeśli zamienimy typy zwracane Base i Derived, powyższy program nie będzie działał. Proszę zobaczyć Ten programu np.

Przykład Dwie klasy używane dla typów zwracanych

Java
// Java Program to Demonstrate Different Return Types // if Return Type in Overridden method is Sub-type // Class 1 class A { } // Class 2 class B extends A { } // Class 3 // Helper class (Base class) class Base {  // Method of this class of class1 return type  A fun()  {  // Display message only  System.out.println('Base fun()');  return new A();  } } // Class 4 // Helper class extending above class class Derived extends Base {  // Method of this class of class1 return type  B fun()  {  // Display message only  System.out.println('Derived fun()');  return new B();  } } // Class 5 // Main class public class GFG {  // Main driver method  public static void main(String args[])  {  // Creating object of class3 type  Base base = new Base();  // Calling method fun() over this object  // inside main() method  base.fun();  // Creating object of class4 type  Derived derived = new Derived();  // Again calling method fun() over this object  // inside main() method  derived.fun();  } } 

Wyjście:  

Base fun() Derived fun()

Utwórz quiz