Jenis Pengembalian Kovarian di Jawa

1. Gambaran keseluruhan

Dalam tutorial ini, kita akan melihat lebih dekat jenis kovarian pengembalian di Java. Sebelum meneliti kovarians dari sudut pandang jenis pengembalian, mari kita lihat apa maksudnya.

2. Kovarians

Kovarians dapat dianggap sebagai kontrak untuk bagaimana subtipe diterima apabila hanya supertype yang ditentukan.

Mari kita pertimbangkan beberapa contoh asas kovarians:

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

Oleh itu, kovarians bermaksud, kita dapat mengakses elemen tertentu yang ditentukan melalui supertype mereka . Namun, kami tidak dibenarkan memasukkan elemen ke dalam sistem kovarian , kerana penyusun akan gagal menentukan jenis struktur generik yang sebenarnya.

3. Jenis Pulangan Kovarian

Yang jenis pulangan kovarian adalah - apabila kita mengatasi kaedah yang - apa yang membolehkan jenis pulangan sebagai subjenis jenis kaedah Pembatal .

Bagi meletakkan ke dalam amalan, mari kita mudah Pengeluar kelas dengan hasil () kaedah . Secara lalai, ia mengembalikan String sebagai Objek untuk memberikan fleksibiliti untuk kelas kanak-kanak:

public class Producer { public Object produce(String input) { Object result = input.toLowerCase(); return result; } }

Hasil daripada Objek sebagai jenis pengembalian, kita dapat mempunyai jenis pengembalian yang lebih konkrit di kelas anak. Itu akan menjadi jenis pengembalian kovarian dan akan menghasilkan nombor dari urutan watak:

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

4. Penggunaan Struktur

Idea utama di sebalik jenis pengembalian kovarian adalah untuk menyokong penggantian Liskov.

Sebagai contoh, mari kita pertimbangkan senario pengeluar berikut:

@Test public void whenInputIsArbitrary_thenProducerProducesString() { String arbitraryInput = "just a random text"; Producer producer = new Producer(); Object objectOutput = producer.produce(arbitraryInput); assertEquals(arbitraryInput, objectOutput); assertEquals(String.class, objectOutput.getClass()); }

Setelah bertukar menjadi IntegerProducer , logik perniagaan yang benar-benar menghasilkan hasilnya tetap sama:

@Test public void whenInputIsSupported_thenProducerCreatesInteger() { String integerAsString = "42"; Producer producer = new IntegerProducer(); Object result = producer.produce(integerAsString); assertEquals(Integer.class, result.getClass()); assertEquals(Integer.parseInt(integerAsString), result); }

Namun, kami masih merujuk hasilnya melalui Objek. Setiap kali kita mula menggunakan rujukan eksplisit untuk IntegerProducer, kita dapat memperoleh hasilnya sebagai Integer tanpa downcasting:

@Test public void whenInputIsSupported_thenIntegerProducerCreatesIntegerWithoutCasting() { String integerAsString = "42"; IntegerProducer producer = new IntegerProducer(); Integer result = producer.produce(integerAsString); assertEquals(Integer.parseInt(integerAsString), result); }

Senario yang terkenal adalah kaedah klon Objek # , yang mengembalikan Objek secara lalai. Setiap kali kita mengatasi kaedah klon () , kemudahan jenis kovarian pengembalian memungkinkan kita memiliki objek pengembalian yang lebih konkrit daripada Objek itu sendiri.

5. Kesimpulan

Dalam artikel ini, kami melihat apa jenis kovarians dan kovarian return dan bagaimana mereka berkelakuan di Java.

Seperti biasa, kodnya tersedia di GitHub.