1. Pemahaman sederhana tentang obat generik
Generik adalah fitur baru Java SE 1.5. Inti dari generik adalah tipe berparameter, artinya tipe data yang dioperasikan ditentukan sebagai parameter. Poin populernya adalah "variabel tipe". Variabel jenis ini dapat digunakan dalam pembuatan kelas, antarmuka, dan metode.
Cara termudah untuk memahami Java generik adalah dengan menganggapnya sebagai sintaks praktis yang menghemat beberapa operasi casting Java:
Copy kode sebagai berikut: List<Apple> box = new ArrayList<Apple>();box.add(new Apple());Apple apple =box.get(0);
Kode di atas sendiri mengungkapkan dirinya dengan sangat jelas: kotak adalah Daftar yang berisi objek Apple. Metode get mengembalikan contoh objek Apple, dan tidak diperlukan konversi tipe dalam proses ini. Tanpa obat generik, kode di atas perlu ditulis seperti ini:
Salin kode sebagai berikut: Apple apple = (Apple)box.get(0);
2. Rasa malu terhadap obat generik
Keuntungan terbesar dari generik adalah memberikan keamanan jenis program dan kompatibel ke belakang, namun juga memiliki kelemahan, yaitu jenis generik harus ditentukan setiap kali didefinisikan. Tidak hanya terasa sedikit bertele-tele untuk menentukannya secara eksplisit, tetapi banyak juga Pemrogram yang tidak terbiasa dengan obat generik, sehingga mereka sering kali tidak dapat memberikan parameter tipe yang benar. Sekarang kompiler dapat secara otomatis menyimpulkan tipe parameter generik, yang dapat mengurangi situasi seperti itu dan meningkatkan kode keterbacaan.
3. Perbaikan inferensi tipe generik di Java 7
Di versi sebelumnya, saat menggunakan tipe generik, Anda perlu menambahkan tipe generik di kedua sisi saat mendeklarasikan dan menetapkan nilai. Misalnya:
Salin kode sebagai berikut: Map<String, String> myMap = new HashMap<String, String>();
Anda mungkin berpikir: Saya sudah menentukan tipe parameter saat mendeklarasikan variabel, mengapa saya perlu menentukannya lagi saat menginisialisasi objek? Untungnya, di Java SE 7 metode ini telah diperbaiki dan sekarang Anda dapat mendeklarasikan dan menetapkan nilai menggunakan pernyataan berikut:
Salin kode sebagai berikut: Map<String, String> myMap = new HashMap<>(); //Perhatikan "<>" di akhir
Dalam pernyataan ini, kompiler akan secara otomatis menyimpulkan tipe generik ketika membuat instance HashMap berdasarkan tipe generik ketika variabel dideklarasikan. Sekali lagi, pastikan untuk memperhatikan "<>" setelah HashMap baru. Hanya menambahkan "<>" ini berarti inferensi tipe otomatis kompilasi kode sumber.
Namun: inferensi tipe Java SE 7 saat membuat instance generik terbatas: hanya jika tipe konstruktor yang diparameterisasi dideklarasikan secara eksplisit dalam konteksnya, inferensi tipe dapat digunakan, jika tidak maka inferensi tipe tidak akan berfungsi. Misalnya: Contoh berikut tidak dapat dikompilasi dengan benar di Java 7 (tetapi sekarang dapat dikompilasi di Java 8, karena tipe generik secara otomatis disimpulkan berdasarkan parameter metode):
Copy kode kodenya sebagai berikut:
Daftar<String> daftar = Daftar Array baru<>();
list.add("A");// Karena addAll mengharapkan parameter bertipe Collection<? extends String>, pernyataan berikut tidak dapat lolos
list.addAll(Daftar Array baru<>());
4. Perbaikan inferensi tipe generik di Java 8
Ada dua tipe utama inferensi tipe target untuk obat generik di Java 8:
1. Mendukung kesimpulan tipe target umum melalui konteks metode
2. Mendukung penerusan inferensi tipe generik ke metode terakhir dalam rantai pemanggilan metode.
Mari kita lihat contoh dari situs resminya:
Copy kode kodenya sebagai berikut:
Daftar kelas<E> {
statis <Z> Daftar<Z> nil() { ... };
statis <Z> Daftar<Z> kontra(Z kepala, Daftar<Z> ekor) { ... };
E kepala() { ... }
}
Sesuai dengan karakteristik JEP101, kita dapat menulis seperti ini saat memanggil metode di atas
Copy kode kodenya sebagai berikut:
//Secara otomatis menyimpulkan tipe generik melalui parameter target dari penetapan metode
Daftar<String> l = Daftar.nil();
//Alih-alih tipe tertentu yang ditampilkan
//Daftar<String> l = Daftar.<String>nil();
//Menyimpulkan tipe generik melalui tipe parameter metode sebelumnya
Daftar.cons(42, Daftar.nil());
//Alih-alih tipe tertentu yang ditampilkan
//Daftar.cons(42, Daftar.<Bilangan Bulat>nil());
5. Ringkasan
Di atas adalah konten fitur JEP101. Sebagai perwakilan dari bahasa statis, Java dapat dikatakan memiliki sistem tipe yang kaya. Masalah konversi antar tipe menjadi masalah bagi setiap programmer Java. Secara otomatis menyimpulkan tipe melalui kompiler dapat sedikit meringankan masalah konversi tipe yang terlalu rumit. Walaupun ini merupakan peningkatan kecil, namun pasti akan berdampak besar pada programmer kita yang menulis kode setiap hari. Setidaknya mereka akan merasa lebih bahagia ~~ Mungkin di Java 9 kita akan mendapatkan var tipe universal, seperti js atau beberapa bahasa dinamis. dari scala seperti itu^_^