Rumah  >  Artikel  >  Java  >  Mari kita sama-sama memahami generik dalam Java

Mari kita sama-sama memahami generik dalam Java

WBOY
WBOYke hadapan
2022-05-18 17:06:462127semak imbas

Artikel ini membawakan anda pengetahuan yang berkaitan tentang java, yang terutamanya memperkenalkan isu yang berkaitan dengan generik, termasuk kelas generik tersuai, kaedah generik tersuai, tersuai Mari kita lihat antara muka generik dan kandungan lain akan membantu semua orang.

Mari kita sama-sama memahami generik dalam Java

Pembelajaran yang disyorkan: "tutorial video java"

  • Generik: ada dalam JDK5 The ciri yang diperkenalkan boleh mengekang jenis data operasi dan menyemaknya pada peringkat penyusunan.
  • Format generik: , Nota: Generik hanya boleh menyokong jenis data rujukan.
  • Semua antara muka dan kelas pelaksanaan sistem pengumpulan menyokong penggunaan generik.

Kelebihan:

  • Jenis data bersatu.
  • Majukan masalah berjalan ke tempoh penyusunan untuk mengelakkan kemungkinan masalah dengan penukaran jenis paksa, kerana jenis boleh ditentukan semasa peringkat penyusunan.
public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("石原里美");
        list.add("工藤静香");
        list.add("朱茵");
        for (String s : list) {
            System.out.println(s);
        }
    }
输出结果:
石原里美
工藤静香
朱茵

Dan generik boleh ditakrifkan di banyak tempat, seperti kelas generik selepas kelas, kaedah generik selepas pengisytiharan kaedah dan antara muka generik selepas antara muka. Seterusnya, mari kita pelajari cara menggunakan generik ini bersama-sama:

Kelas generik tersuai

Konsep

  • Definisi kelas A kelas yang mentakrifkan generik di masa yang sama ialah kelas generik.
  • Format kelas generik: nama kelas pengubahsuai { Jenis data boleh ditentukan pada peringkat, serupa dengan peranan koleksi
Pengajaran praktikal
public class MyArrayList<E>{    }
    Sekarang cipta kelas generik untuk melaksanakan operasi tambah dan padam asas untuk mengetahui lebih lanjut tentang penggunaannya :

Prinsip kelas generik:

Gantikan semua kejadian pembolehubah generik dengan jenis data sebenar yang dihantar.
//泛型类MyArrayLIst
public class MyArrayLIst<E> {
    public void add(E e){

    }
    public void remove(E e){

    }
}
//main
public static void main(String[] args) {
        MyArrayLIst<String> list = new MyArrayLIst<>();
        //通过对泛型的设定,实现对数据专一处理
        list.add("石原里美");
        list.add("工藤静香");
        list.remove("工藤静香");
    }

Melalui pemerhatian yang teliti, tidak sukar untuk mencari bahawa perbezaan terbesar antara kelas generik dan kelas biasa ialah data yang sama boleh diproses secara seragam apabila kaedah memanggil, dan jenis data lain tidak akan terlibat tahap tertentu, masalah yang mungkin timbul semasa penukaran jenis paksa dapat dielakkan.

Kaedah generik tersuai

Konsep

Kaedah yang mentakrifkan kaedah generik pada masa yang sama ialah kaedah generik .

Format kaedah generik: pengubah nama kaedah jenis nilai pulangan (senarai parameter formal) {      }

  • >
  • Nota:
Kaedah generik perlu dibezakan daripada kaedah yang ditakrifkan dalam kelas generik Walaupun mereka juga menggunakan generik, generik tidak ditakrifkan oleh mereka, tetapi oleh Kelas generik.
public <E> void view(E e){    }
  • Pengajaran praktikal
  • Tidak kira apa jenis tatasusunan yang dihantar, kandungannya boleh dikembalikan, iaitu fungsi Arrays.toString() direalisasikan
  • Dengan melaksanakan definisi kaedah generik, pelbagai jenis data boleh diterima dan skop aplikasi lebih luas.

Antara muka generik tersuai

Konsep

public static void main(String[] args) {
        String [] name = {"石原里美","工藤静香","朱茵"};
        view(name);
        Integer [] age = {18,19,20};
        view(age);
    }
    public static  <T> void view(T[] arr){
        StringBuilder list = new StringBuilder();
        for (int i = 0; i < arr.length; i++) {
            list.append(arr[i]).append("\t");
        }
        System.out.println(list);
    }

Antara muka yang ditakrifkan menggunakan generik ialah antara muka generik.

Format antara muka generik: antara muka awam People{   }

  • Fungsi: Antara muka generik membenarkan kelas pelaksanaan Pilih data taip bahawa fungsi semasa perlu beroperasi
  • Pengajaran praktikal
public interface People <E>{    }
Tentukan antara muka Orang untuk melaksanakan operasi pada kelas Guru, kelas Pelajar, dsb.
  • Dengan memerhati kod di atas, kita boleh mendapati bahawa jenis yang ditakrifkan selepas Orang, maka kelas pelaksanaan hanya boleh beroperasi pada jenis data ini, dan jenis lain tidak boleh melakukan operasi ini.

通配符和上下限 

通配符 

  • ?可以在“使用泛型”的时候代表一切类型
  • E T K V是在定义泛型的时候用的 

 假设现在有一场为学生和老师而举办的比赛,需要比较速度究竟谁更快,分别创建一定数量的对象并将其传入集合之中。然而当我们将这两个集合分别传入方法中的时候,会发现,学生对象集合list2出现报错,为什么呢?原因是因为数据类型不同,那么该如何使得两种类型都可以传入呢?或许这个时候就会有人说了:“既然两个类都是People的子类,那么为什么不定义它的泛型是People呢?”这个想法很好,但是我们需要明确一点的是子类与父类虽然是有关系的,但是定义之后的集合是没有关系的,所以这里是行不通的。

//main
//老师对象集合
ArrayList<Teacher> list1 = new ArrayList<>();
list1.add(new Teacher());
list1.add(new Teacher());
pk(list1);
//学生对象集合
ArrayList<Student> list2 = new ArrayList<>();
list2.add(new student());
list2.add(new student());
pk(list2);//由于pk方法的形参是泛型为Teacher的集合,所以会报错
//父类
class People{

    }
//子类
class Teacher extends People{

    }
class student extends People{

    }
//pk方法:
public static void pk(ArrayList<Teacher> people){
}

应对这个问题,我们可以便可以将本篇文章引入的知识“通配符”放在实际应用中解决问题了,通过其简短的概念“?可以在‘使用泛型’的时候代表一切类型”就可以理解其作用了,这里我们可以使用“?”共同代表两种类型。

public static void pk(ArrayList<?> people){
//通过通配符?便可以将这个问题解决掉
    }

 上下限 

然而此时又出现一个问题,定义了一个dog类,试图创建一些对象并传入集合中混入比赛,这种当然情况当然是不允许发生的,然而?是可以表示任意类型的,并不能对其进行限制。因此上下限的作用就体现出来了:

  •  上限:,传入类型必须是该父类或者是父类的子类
  • 下限:,传入类型必须是该子类或者是子类的父类
public static void pk(ArrayList<? extends People> people){
//通过上下限便可以将这个问题解决掉
//要求传入的类型必须是People的子类才可以
    }

推荐学习:《java视频教程

Atas ialah kandungan terperinci Mari kita sama-sama memahami generik dalam Java. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:csdn.net. Jika ada pelanggaran, sila hubungi admin@php.cn Padam