Rumah > Java > javaTutorial > teks badan

Analisis Bermula dengan Java Generics

WBOY
Lepaskan: 2023-04-29 21:19:12
ke hadapan
1513 orang telah melayarinya

1. Apakah itu generik?

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];
    }
}
Salin selepas log masuk

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];
    }
}
Salin selepas log masuk

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);
    }
Salin selepas log masuk

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];
    }
}
Salin selepas log masuk
rrree

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

Analisis Bermula dengan Java Generics

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.

2. Cara generik disusun

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.

Mekanisme kompilasi generik: mekanisme pemadaman

Semasa penyusunan, E dalam MyArrayList dipadamkan ke dalam jenis Objek.

Analisis Bermula dengan Java Generics

semuanya ditukar kepada jenis MyArrayList dalam kaedah utama.

Analisis Bermula dengan Java Generics

Atas ialah kandungan terperinci Analisis Bermula dengan Java Generics. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:yisu.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan