Intipati generik adalah untuk membuat parameter jenis (tanpa mencipta jenis baharu, untuk mengawal jenis sekatan parameter tertentu melalui jenis yang ditentukan oleh generik) ).
Pertama lihat contoh berikut:
Tatasusunan yang kami pelajari sebelum ini hanya boleh menyimpan elemen jenis tertentu. Contohnya: int[] array=new int[10];String[] array=new String[10];
Kelas Objek ialah kelas induk bagi semua kelas, jadi bolehkah kita mencipta tatasusunan Obj?
class Myarray{ public Object[] array=new Object[10]; public void setVal(int pos,Object val){ this.array[pos]=val; } public Object getPos(int pos){ return this.array[pos]; } } public class TestDemo{ public static void main(String[] args) { Myarray myarray=new Myarray(); myarray.setVal(1,0); myarray.setVal(2,"shduie");//字符串也可以存放 String ret=(String)myarray.getPos(2);//虽然我们知道它是字符串类型,但是还是要强制类型转换 System.out.println(ret); } }
Selepas melaksanakan kod di atas, kami mendapati:
Sebarang jenis data boleh disimpan
Tidak . 2 Objek yang dimuat turun pada asalnya adalah rentetan, tetapi penukaran jenis paksa
diperlukan untuk memperkenalkan generik Tujuan generik adalah untuk menentukan jenis objek yang sepatutnya disimpan oleh bekas semasa Pengkompil menyemaknya sendiri.
nama kelas generik kelas4bbc9e751e6c7fdcb5f4643ae70e5217{
//Parameter jenis boleh digunakan di sini
}
Penggunaan generik:
Kelas generik7c8c24816bb7c4947d0227e08b3a6398 nama pembolehubah=kelas generik baharuf38bd68e6053d606bc185d4e5920b89d(parameter sebenar kaedah pembina)
MyArray list=new MyArraya8093152e673feb7aba1828c43532094();
[Nota]
//此处T可以随便写为任意标识,常见的如T、E、K、V等形式的参数常用于表示泛型 //在实例化泛型类时,必须指定T的具体类型 public class Test<T>{ //key这个成员变量的类型为T,T的类型由外部指定 private T key; public Test(T key) { //泛型构造方法形参key的类型也为T,T的类型由外部指定 this.key = key; } public T getKey(){ //泛型方法getKey的返回值类型为T,T的类型由外部指定 return key; } }memadamkan Mekanisme penyingkiran: Jenis dalam a8093152e673feb7aba1828c43532094 akan dipadamkan semasa penyusunan, jadi perkara dalam a8093152e673feb7aba1828c43532094 tidak akan mengambil bahagian dalam komposisi jenis. Akan memadamkan T sebagai Objek. Mengapa tatasusunan jenis generik tidak boleh dijadikan instantiated? Perbezaan penting antara tatasusunan dan generik ialah cara mereka menguatkuasakan semakan jenis. Tatasusunan menyimpan dan menyemak maklumat jenis semasa runtime, manakala generik menyemak ralat jenis pada masa penyusunan. Tatasusunan Objek yang dikembalikan boleh menyimpan sebarang jenis data, seperti rentetan, yang diterima melalui tatasusunan jenis int Pengkompil menganggapnya tidak selamat. 3. Sempadan atas generik
Sintaks: nama kelas generik kelase409c7be7a8cfc69fddba375bfd92bc2{ }Contoh:
kelas awam MyArray{} //E hanya boleh menjadi Nombor atau subkelas Nombor
kelas awam MyArray091a568f4b5c8ae6ac2165c84c2d6226>{}//E mestilah kelas yang melaksanakan antara muka Sebanding[Nota] E tanpa sempadan tertentu boleh dilihat Jadikan E melanjutkan Objek4. Watak kad bebas ? Untuk kegunaan dalam generik, ia adalah kad bebas. Kad bebas digunakan untuk menyelesaikan masalah bahawa jenis anti-generik tidak boleh menjadi kovarian. Dua keping kod berikut:
代码一: public static<T> void printList1(ArrayList<T> list){ for(T x:list){ System.out.println(x); } } 代码二: public static<T> void printList2(ArrayList<?> list){ for(Object x:list){ System.out.println(x); } }Kad liar digunakan dalam kod 2. Berbanding dengan kod 1, kami tidak tahu jenis data khusus yang dihantar ke kod 1 pada masa ini daripada. (1) Batas atas kad bebas Sintaks:
96ed609681f71cf328ae781c8e289be3 mengenakan sekatan ke atas T, yang hanya boleh menjadi subkelas Haiwan. Masuk Kucing, itu Kucing.//Anda perlu menggunakan kad bebas untuk menentukan jenis ibu bapa dan anakMyArrayListe9be635a5d11110fea22e135edf2a626 >
- Untuk kaedah yang dilaksanakan oleh kad bebas, ia bersamaan dengan menetapkan Haiwan dan membenarkan subkelas Haiwan dihantar masuk. Subkategori khusus tidak jelas pada masa ini. Contohnya: apabila Cat dihantar masuk, jenis yang diisytiharkan ialah Haiwan Hanya dengan menggunakan polimorfisme kaedah Cat boleh dipanggil
- hubungan kelas induk-anak & rarr; 🎜>
MyArrayList6b3d0130bba23ae47fe2b8e8cddf0195 adakah MyArrayList< ;? melanjutkan kelas induk Number> [Nota]ArrayList<Integer> arrayList1 = new ArrayList<>(); ArrayList<Double> arrayList2 = new ArrayList<>(); List<? extends Number> list = arrayList1; //list.add(1,1);//报错,此时list的引用的子类对象有很多,再添加的时候,任何子类型都可以,为了安全,java不让这样进行添加操作。 Number a = list.get(0);//可以通过 Integer i = list.get(0);//编译错误,只能确定是Number子类tidak boleh ditambah , dan senarai yang disimpan mungkin Nombor atau Ia adalah subkelas Nombor dan jenisnya tidak dapat ditentukan.
- Sempadan atas kad bebas sesuai untuk membaca tetapi bukan untuk menulis.
- (2) Sempadan bawah kad bebas Sintaks:
274b42d40a9a9a3a20e3e4beca96d3a7//Jenis parameter yang boleh dihantar ialah Integer atau kelas induk Integer
Hubungan kelas induk-anak bagi sempadan bawah kad bebas:
MyArrayList474555482eb79f9e4e676a9012437c1d是MyArrayList1c0477c859e3a4cbd4faa63087d62a35的父类类型
MyArrayLista10469e4b40f04339ce5bebfbf5abb4c是MyArrayList474555482eb79f9e4e676a9012437c1d的父类
通配符下界适合写入元素,不适合读取。
5、包装类
在Java中,由于基本类型不是继承自Object,为了在泛型中可以支持基本类型,每个基本类型都对应了一个包装类。除了Integer和Character,其余基本类型的包装类都是首字母大写。
拆箱和装箱:
int i=10; //装箱操作,新建一个Integer类型对象,将i的值放入对象的某个属性中 Integer ii=i; //自动装箱 //Integer ii=Integer.valueOf(i); Integer ij= new Integer(i);//显示装箱 //拆箱操作,将Integer对象中的值取出,放到一个基本数据类型中 int j=ii.intValue();//显示的拆箱 int jj=ii;//隐式的拆箱
Atas ialah kandungan terperinci Generik Java dan analisis contoh kelas pembalut. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!