Maison  >  Article  >  Java  >  Comprenons ensemble les génériques en Java

Comprenons ensemble les génériques en Java

WBOY
WBOYavant
2022-05-18 17:06:462063parcourir

Cet article vous apporte des connaissances pertinentes sur java, qui introduit principalement des problèmes liés aux génériques, notamment les classes génériques personnalisées, les méthodes génériques personnalisées, les interfaces génériques personnalisées, etc., jetons-y un coup d'œil, j'espère que cela vous sera utile pour tout le monde.

Comprenons ensemble les génériques en Java

Étude recommandée : "Tutoriel vidéo Java"

  • Génériques : est une fonctionnalité introduite dans JDK5, qui peut contraindre les types de données des opérations pendant la phase de compilation et les vérifier.
  • Format des génériques : , Remarque : les génériques ne peuvent prendre en charge que les types de données de référence.
  • Toutes les interfaces et classes d'implémentation du système de collecte prennent en charge l'utilisation de génériques.

Avantages :

  • Type de données unifié.
  • Avancez les problèmes d'exécution jusqu'à la période de compilation, en évitant d'éventuels problèmes de conversion de type forcée, car le type peut être déterminé pendant la phase de compilation.
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);
        }
    }
输出结果:
石原里美
工藤静香
朱茵

Et les génériques peuvent être définis à de nombreux endroits, comme les classes génériques après les classes, les méthodes génériques après les déclarations de méthode et les interfaces génériques après les interfaces. Apprenons ensuite comment utiliser ces génériques ensemble :

Classe générique personnalisée

Concept

  • Une classe qui définit en même temps un générique est une classe générique.
  • Format de la classe générique : classe de modificateur nom de classe {     }
public class MyArrayList<E>{    }
  • Fonction : Le type de données peut être spécifié lors de la phase de compilation, similaire au rôle d'un ensemble

Enseignement pratique

Créez maintenant une classe générique pour implémenter les opérations d'ajout et de suppression de base afin de comprendre son utilisation en détail :

//泛型类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("工藤静香");
    }

Le principe des classes génériques :

Remplacez tous les endroits où apparaissent les variables génériques par les vraies qui sont transférées. Type de données .

Grâce à une observation attentive, il n'est pas difficile de constater que la plus grande différence entre les classes génériques et les classes ordinaires est que les mêmes données peuvent être traitées uniformément lors de l'appel de méthodes et que d'autres types de données ne seront pas impliqués dans une certaine mesure. cela peut survenir lors de la conversion forcée de type.

Méthode générique personnalisée

Concept

  • Une méthode qui définit en même temps une méthode générique est une méthode générique.
  • Format de la méthode générique : modificateur nom de la méthode du type de valeur de retour (liste formelle de paramètres) { , la méthode est plus polyvalente.
Remarque :
    Les méthodes génériques doivent être distinguées des méthodes définies dans les classes génériques. Bien qu'elles utilisent également des génériques, les génériques ne sont pas définis par elles, mais par la classe générique.
  • Enseignement pratique Quel que soit le type de tableau transmis, son contenu peut être renvoyé, c'est-à-dire que la fonction Arrays.toString() est implémentée
public <E> void view(E e){    }
En implémentant la définition de méthodes génériques, plusieurs types de données peut être mis en œuvre. La plage de réception et d'application est plus large.

Interface générique personnalisée

Concept

Une interface définie à l'aide de génériques est une interface générique.

Le format de l'interface générique : interface publique People{   }
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);
    }
  • Fonction : L'interface générique permet à la classe d'implémentation de sélectionner le type de données dont la fonction actuelle a besoin pour fonctionner
  • Enseignement pratique
    • Définissez une interface Personnes, implémentez des opérations sur la classe Enseignant, la classe Étudiant, etc.
    public interface People <E>{    }
    En observant le code ci-dessus, vous pouvez découvrir quel type est défini après Personnes, puis la classe d'implémentation ne peut opérer que sur ce type de données, et tout autre type n'est pas autorisé pour cette opération.

    通配符和上下限 

    通配符 

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

    Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

    Déclaration:
    Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer