Covariantný návratový typ v Jave

1. Prehľad

V tomto výučbe sa bližšie pozrieme na typ kovariantného návratu v Jave. Pred preskúmaním kovariancie z pohľadu návratového typu sa pozrime, čo to znamená.

2. Kovariancia

Kovarianciu možno považovať za zmluvu o tom, ako je podtyp akceptovaný, keď je definovaný iba supertyp.

Uvažujme o niekoľkých základných príkladoch kovariancie:

List integerList = new ArrayList (); Zoznam doubleList = nový ArrayList ();

Takžekovariancia znamená, že môžeme pristupovať k špecifickým prvkom definovaným prostredníctvom ich supertypu. Avšak nesmieme dávať prvky do kovariančného systému, pretože kompilátor nedokáže určiť skutočný typ generickej štruktúry.

3. Covariantný návratový typ

The kovariantný návratový typ je - keď prepíšeme metódu - čo umožňuje, aby návratový typ bol podtypom typu prepísanej metódy.

Aby sme to uviedli do praxe, vezmime si jednoduchý Výrobca trieda s a vyrobiť () metóda. V predvolenom nastavení vráti a String ako Objekt poskytnúť flexibilitu triedam detí:

public class Producer {public Object produce (String input) {Object result = input.toLowerCase (); návratový výsledok; }}

V dôsledku Objekt ako návratový typ môžeme mať v podradenej triede konkrétnejší návratový typ. Bude to kovariantný návratový typ a vyprodukuje čísla zo znakových sekvencií:

public class IntegerProducer extends Producer {@Override public Integer produce (String input) {return Integer.parseInt (input); }}

4. Využitie štruktúry

Hlavnou myšlienkou kovariančných návratových typov je podpora substitúcie Liskov.

Uvažujme napríklad o nasledujúcom scenári producenta:

@Test public void whenInputIsArbitrary_thenProducerProducesString () {String arbitraryInput = "iba náhodný text"; Producent producent = nový Producent (); Objekt objectOutput = producer.produce (arbitraryInput); assertEquals (arbitraryInput, objectOutput); assertEquals (String.class, objectOutput.getClass ()); }

Po zmene na IntegerProducer, obchodná logika, ktorá v skutočnosti vedie k výsledku, môže zostať rovnaká:

@Test public void whenInputIsSupported_thenProducerCreatesInteger () {String integerAsString = "42"; Producent producent = new IntegerProducer (); Výsledok objektu = producent.produce (integerAsString); assertEquals (Integer.class, result.getClass ()); assertEquals (Integer.parseInt (integerAsString), výsledok); }

Stále však odkazujeme na výsledok pomocou Objekt. Kedykoľvek začneme používať výslovný odkaz na IntegerProducer, môžeme získať výsledok ako Celé číslo bez downcastingu:

@Test public void whenInputIsSupported_thenIntegerProducerCreatesIntegerWithoutCasting () {String integerAsString = "42"; IntegerProducer producer = new IntegerProducer (); Výsledok celého čísla = producent.produce (integerAsString); assertEquals (Integer.parseInt (integerAsString), výsledok); }

Známym scenárom je Objekt #klon metóda, ktorá vracia Objekt predvolene. Kedykoľvek prepíšeme klon () metóda, zariadenie typov kovariantných návratov nám umožňuje mať konkrétnejší návratový objekt ako Objekt sám.

5. Záver

V tomto článku sme videli, čo sú kovariancie a typy kovariančných návratov a ako sa správajú v Jave.

Ako vždy, kód je k dispozícii na GitHub.


$config[zx-auto] not found$config[zx-overlay] not found