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.