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.