Heim  >  Artikel  >  Java  >  Lassen Sie uns gemeinsam Generika in Java verstehen

Lassen Sie uns gemeinsam Generika in Java verstehen

WBOY
WBOYnach vorne
2022-05-18 17:06:462067Durchsuche

Dieser Artikel vermittelt Ihnen relevantes Wissen über Java, in dem hauptsächlich Probleme im Zusammenhang mit Generika vorgestellt werden, einschließlich benutzerdefinierter generischer Klassen, benutzerdefinierter generischer Methoden, benutzerdefinierter generischer Schnittstellen usw. Schauen wir uns das gemeinsam an. Ich hoffe, es wird hilfreich sein an alle.

Lassen Sie uns gemeinsam Generika in Java verstehen

Empfohlene Studie: „Java-Video-Tutorial

  • Generika: ist eine in JDK5 eingeführte Funktion, die die Datentypen von Vorgängen während der Kompilierungsphase einschränken und überprüfen kann.
  • Format von Generics: , Hinweis: Generics können nur Referenzdatentypen unterstützen.
  • Alle Schnittstellen und Implementierungsklassen des Sammlungssystems unterstützen die Verwendung von Generika.

Vorteile:

  • Einheitlicher Datentyp.
  • Verschieben Sie laufende Probleme in die Kompilierungsphase und vermeiden Sie mögliche Probleme mit erzwungener Typkonvertierung, da der Typ während der Kompilierungsphase bestimmt werden kann.
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);
        }
    }
输出结果:
石原里美
工藤静香
朱茵

Und Generika können an vielen Stellen definiert werden, z. B. generische Klassen nach Klassen, generische Methoden nach Methodendeklarationen und generische Schnittstellen nach Schnittstellen. Als nächstes lernen wir, wie man diese Generika zusammen verwendet:

Benutzerdefinierte generische Klasse

Konzept

  • Eine Klasse, die gleichzeitig ein Generikum definiert, ist eine generische Klasse.
  • Format der generischen Klasse: Modifikatorklasse-Klassenname
  • Erstellen Sie nun eine generische Klasse, um grundlegende Add- und Löschoperationen zu implementieren, um deren Verwendung im Detail zu verstehen:
public class MyArrayList<E>{    }
  • Das Prinzip generischer Klassen:

Ersetzen Sie alle Stellen, an denen generische Variablen auftreten, durch die echten, übertragenen Datentypen .

Durch sorgfältige Beobachtung ist es nicht schwer festzustellen, dass der größte Unterschied zwischen generischen Klassen und gewöhnlichen Klassen darin besteht, dass beim Aufrufen von Methoden dieselben Daten einheitlich verarbeitet werden können und andere Datentypen nicht involviert sind. Bis zu einem gewissen Grad werden Probleme vermieden Dies kann beim Erzwingen der Typkonvertierung auftreten.

Benutzerdefinierte generische Methode

Konzept

Eine Methode, die gleichzeitig eine generische Methode definiert, ist eine generische Methode.

Format der generischen Methode: Modifikator Rückgabewerttyp Methodenname (formale Parameterliste) { , die Methode ist vielseitiger.

Hinweis:
    Generische Methoden müssen von Methoden unterschieden werden, die in generischen Klassen definiert sind. Obwohl sie auch Generika verwenden, werden die Generika nicht durch sie, sondern durch die generische Klasse definiert.
  • Praktischer Unterricht Egal welche Art von Array übergeben wird, sein Inhalt kann zurückgegeben werden, das heißt, die Funktion von Arrays.toString() wird implementiert
//泛型类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("工藤静香");
    }
Durch die Implementierung der Definition generischer Methoden werden mehrere Datentypen implementiert umsetzbar. Der Empfangs- und Anwendungsbereich ist breiter.
  • Benutzerdefinierte generische Schnittstelle
  • Konzept
  • Eine mithilfe von Generika definierte Schnittstelle ist eine generische Schnittstelle.

Das Format der generischen Schnittstelle: öffentliche Schnittstelle People{   }

public <E> void view(E e){    }

Funktion: Die generische Schnittstelle ermöglicht es der Implementierungsklasse, den Datentyp auszuwählen, den die aktuelle Funktion zum Betrieb benötigt.

Praktischer Unterricht
  • Definieren Sie eine Personenschnittstelle, implementieren Sie Operationen für die Lehrerklasse, die Schülerklasse usw.
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);
    }
  • Durch Beobachtung des obigen Codes können Sie herausfinden, welcher Typ nach Personen definiert ist. Dann kann die Implementierungsklasse nur mit diesem Datentyp arbeiten. Ein anderer Typ ist für diesen Vorgang nicht zulässig.

    通配符和上下限

    通配符

    • ?可以在“使用泛型”的时候代表一切类型
    • 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视频教程

    Das obige ist der detaillierte Inhalt vonLassen Sie uns gemeinsam Generika in Java verstehen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

  • Stellungnahme:
    Dieser Artikel ist reproduziert unter:csdn.net. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen