Jenis Pengembalian Kovarian di Java

1. Ikhtisar

Dalam tutorial ini, kita akan melihat lebih dekat pada tipe kembalian kovarian di Java. Sebelum memeriksa kovarians dari sudut pandang tipe kembalian, mari kita lihat apa artinya.

2. Kovarian

Kovarian dapat dianggap sebagai kontrak tentang bagaimana subtipe diterima ketika hanya supertipe yang ditentukan.

Mari pertimbangkan beberapa contoh dasar kovarian:

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

Jadi kovarians artinya, kita dapat mengakses elemen tertentu yang ditentukan melalui supertipe mereka . Namun, kami tidak diizinkan untuk menempatkan elemen ke dalam sistem kovarian , karena kompilator akan gagal menentukan tipe sebenarnya dari struktur generik.

3. Jenis Pengembalian Kovarian

The tipe kembali kovarian adalah - ketika kita menimpa metode - yang memungkinkan jenis kembali menjadi subtipe dari jenis metode ditimpa .

Untuk menempatkan ini ke dalam praktek, mari kita sederhana Produser kelas dengan hasil () metode . Secara default, ini mengembalikan String sebagai Objek untuk memberikan fleksibilitas untuk kelas anak:

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

Sebagai hasil dari Object sebagai tipe kembalian, kita bisa memiliki tipe kembalian yang lebih konkret di kelas anak. Itu akan menjadi tipe pengembalian kovarian dan akan menghasilkan angka dari urutan karakter:

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

4. Penggunaan Struktur

Ide utama di balik jenis kembalian kovarian adalah untuk mendukung substitusi Liskov.

Misalnya, mari pertimbangkan skenario produser 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 beralih ke IntegerProducer , logika bisnis yang benar-benar memberikan hasil dapat 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 mereferensikan hasilnya melalui Object. Setiap kali kami mulai menggunakan referensi eksplisit ke IntegerProducer, kami dapat mengambil 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); }

Skenario terkenal adalah metode klon Objek # , yang mengembalikan Objek secara default. Setiap kali kita mengganti metode clone () , fasilitas tipe kembalian kovarian memungkinkan kita memiliki objek pengembalian yang lebih konkret daripada Objek itu sendiri.

5. Kesimpulan

Dalam artikel ini, kita melihat apa itu jenis kembalian kovarian dan kovarian dan bagaimana perilakunya di Jawa.

Seperti biasa, kode tersedia di GitHub.