A kovariáns visszatérési típus Java-ban

1. Áttekintés

Ebben az oktatóanyagban alaposabban megvizsgáljuk a kovariáns visszatérési típust a Java-ban. Mielőtt megvizsgálnánk a kovarianciát a visszatérési típus szempontjából, nézzük meg, mit jelent ez.

2. Kovariancia

A kovariancia szerződésnek tekinthető abban, hogy egy altípust hogyan fogadnak el, ha csak a szupertípus van meghatározva.

Vizsgáljunk meg néhány alapvető kovariancia példát:

List integerList = new ArrayList (); List doubleList = new ArrayList ();

Ígya kovariancia azt jelenti, hogy hozzáférhetünk a szupertípusukon keresztül meghatározott meghatározott elemekhez. Azonban, nem szabad elemeket kovariáns rendszerbe helyezni, mivel a fordító nem tudná meghatározni az általános struktúra tényleges típusát.

3. A kovariáns visszatérési típus

A a kovariáns visszatérés típusa - ha felülírunk egy metódust - lehetővé teszi, hogy a visszatérési típus a felülbírált módszer típusának altípusa legyen.

Ennek gyakorlati megvalósításához vegyünk egy egyszerűt Termelő osztály a termel () módszer. Alapértelmezés szerint a Húr mint egy Tárgy rugalmasság biztosítása a gyermekosztályok számára:

public class Producer {public Object produkció (String input) {Object result = input.toLowerCase (); visszatérési eredmény; }}

Ennek eredményeként Tárgy visszatérési típusként konkrétabb visszatérési típusunk lehet a gyermekosztályban. Ez lesz a kovariáns visszatérési típus, és számokat állít elő a karakterek sorozatából:

public class IntegerProducer kiterjeszti a Producert {@Orride public Integer produkció (String input) {return Integer.parseInt (input); }}

4. A szerkezet használata

A kovariáns visszatérési típusok fő gondolata a Liskov-helyettesítés támogatása.

Vegyük például a következő gyártói forgatókönyvet:

@Test public void whenInputIsArbitrary_thenProducerProducesString () {String arbitraryInput = "csak véletlenszerű szöveg"; Producer producer = új Producer (); Object objectOutput = producer.produce (arbitraryInput); assertEquals (arbitraryInput, objectOutput); assertEquals (Karakterlánc.osztály, objectOutput.getClass ()); }

Miután átváltott a IntegerProducer, az eredményt ténylegesen előállító üzleti logika változatlan maradhat:

@Test public void whenInputIsSupported_thenProducerCreatesInteger () {String integerAsString = "42"; Producer producer = new IntegerProducer (); Objektum eredménye = producer.produce (integerAsString); assertEquals (Egész szám.osztály, eredmény.getClass ()); assertEquals (Integer.parseInt (integerAsString), eredmény); }

Az eredményt azonban továbbra is egy Tárgy. Valahányszor kifejezett hivatkozást kezdünk használni a IntegerProducer, az eredményt lekérdezhetjük Egész szám lecsökkentés nélkül:

@Test public void whenInputIsSupported_thenIntegerProducerCreatesIntegerWithoutCasting () {String integerAsString = "42"; IntegerProducer producer = új IntegerProducer (); Egész eredmény = producer.produce (integerAsString); assertEquals (Integer.parseInt (integerAsString), eredmény); }

Jól ismert forgatókönyv a Tárgy#klón metódus, amely egy Tárgy alapértelmezés szerint. Valahányszor felülírjuk a klón () módszerrel a kovariáns visszatérési típusok lehetősége lehetővé teszi számunkra, hogy a Tárgy maga.

5. Következtetés

Ebben a cikkben azt láttuk, hogy mi a kovariancia és a kovariáns visszatérési típus, és hogyan viselkednek a Java-ban.

Mint mindig, a kód elérhető a GitHubon.