Generik sebenarnya menghantar jenis sebagai parameter membolehkan pengaturcara menggunakan beberapa jenis yang ditentukan kemudian apabila menulis kod, mereka akan Jenis yang dikehendaki dihantar sebagai hujah untuk menentukan jenis ini.
Mengapa memperkenalkan generik?
Contohnya: Laksanakan jadual jujukan sendiri
public class MyArrayList { public int[] elem; public int usedSize; public MyArrayList() { this.elem = new int[10]; } // add方法 public void add(int val) { // 暂时不考虑扩容问题,这里只是为了讲泛型 elem[usedSize++] = val; } // get方法 public int get(int pos) { return elem[pos]; } }
Seperti yang anda lihat di sini, apabila menggunakan jadual jujukan tersuai di atas, kami hanya boleh menambah elemen jenis int. Kami tahu bahawa dalam java koleksi Sebarang jenis data boleh ditambah pada jadual jujukan. Bagaimanakah ini dicapai? Di sini kami mula-mula cuba menukar jenis int ke dalam jenis Objek, supaya kami boleh menjamin bahawa mana-mana jenis boleh dihantar masuk.
public class MyArrayList { public Object[] elem; public int usedSize; public MyArrayList() { this.elem = new Object[10]; } // add方法 public void add(Object val) { // 暂时不考虑扩容问题,这里只是为了讲泛型 elem[usedSize++] = val; } // get方法 public Object get(int pos) { return elem[pos]; } }
Apabila menambah data pada objek dalam kaedah utama, anda boleh menambah apa-apa jenis data. Walau bagaimanapun, apabila data perlu dikeluarkan, kerana jenis yang dikembalikan ialah Objek, penukaran paksa diperlukan untuk menerimanya dengan jenis yang sepadan, yang sangat menyusahkan.
public static void main(String[] args) { MyArrayList myArrayList = new MyArrayList(); myArrayList.add(1); myArrayList.add("hello"); int array1 = (int)myArrayList.get(0); String array2 = (String)myArrayList.get(1); }
Jadi persoalannya, adakah ia perlu dipaksa untuk dimajukan setiap kali sebelum dapat dielakkan? Pada masa ini, kami fikir bahawa apabila mencipta objek contoh, kami boleh lulus jenis yang dikehendaki sebagai parameter, supaya semua data jenis yang diluluskan boleh disimpan dalam objek ini Kemudian apabila kami mengeluarkannya, kami dapat mengenal pasti dengan jelas semua data dalam objek Mereka semua jenis ini, tidak perlu memaksa pemindahan. Ini memperkenalkan generik.
public class MyArrayList<E> { // 在编写程序时,不指定具体的类型,而用<E>这里的E来暂时代替 // 具体的类型在实例化对象时传入 public E[] elem; public int usedSize; public MyArrayList() { // 这里的写法不是特别准确,应该用反射机制,这里先这样写 this.elem = (E[])new Object[10]; } // add方法 public void add(E val) { // 暂时不考虑扩容问题,这里只是为了讲泛型 elem[usedSize++] = val; } // get方法 public E get(int pos) { return elem[pos]; } }
Ini memastikan bahawa sebarang jenis data boleh dihantar masuk, dan tidak perlu memaksanya apabila mengeluarkannya! Maksud generik:
1. Semak jenis secara automatik
2. Lakukan penukaran jenis paksa secara automatik
Jadi apakah jenis objek MyArrayList yang sepadan di sini? Adakah itu MyArrayList
Dapat dilihat di sini bahawa objek yang dibuat oleh contoh adalah semua jenis MyArrayList dan kandungan dalam tidak mengambil bahagian dalam komposisi generik taip, kemudian >Di manakah jenis di dalamnya? Ini memerlukan pemahaman mekanisme kerja generik.
Perbezaan penting antara tatasusunan dan generik ialah cara mereka menguatkuasakan semakan jenis. Khususnya, tatasusunan menyimpan dan menyemak maklumat jenis semasa masa jalan. Walau bagaimanapun, generik menyemak ralat jenis pada masa penyusunan dan tidak mempunyai maklumat jenis semasa runtime.
Semasa penyusunan, E dalam MyArrayList dipadamkan ke dalam jenis Objek.
semuanya ditukar kepada jenis MyArrayList dalam kaedah utama.
Atas ialah kandungan terperinci Analisis Bermula dengan Java Generics. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!