Maison Java javaDidacticiel Quelles sont les différences entre les espaces réservés T et ? dans les génériques Java ?

Quelles sont les différences entre les espaces réservés T et ? dans les génériques Java ?

May 11, 2023 pm 06:10 PM
java

Deux premiers morceaux de code :

public static <T> void show1(List<T> list){
 for (Object object : list) {
        System.out.println(object.toString());
    }
}

public static void show2(List<?> list) {
    for (Object object : list) {
        System.out.println(object);
    }
}
Copier après la connexion

Vous pouvez voir que nous utilisons T dans la méthode show1 Tout le monde sait que c'est une façon courante d'écrire des génériques, donc T fait ici référence à un certain. Les objets spécifiques à une classe ne peuvent stocker que des données du même type dans la collection de listes. Si différents types de données sont insérés, une erreur sera signalée.

Alors qu'est-ce qu'on utilise dans la méthode show2 ? , vous pouvez voir qu'il n'y a pas de <T> devant void ? Il peut être exprimé sous forme d'espace réservé et il ne sait pas combien de types de données seront stockés dans la collection de listes, cela montre donc qu'il est également possible de stocker N types de données dans notre liste. <T>,?可以表示成占位符,它自己也不知道list集合中会存放多少种类型的数据,所以这样就表明我们的list中存放N种数据类型也是可以的。

我们通过一段测试代码来直观的感受一下二者的区别吧:

public static void test(){
   List<Student> list1 = new ArrayList<>();
   list1.add(new Student("zhangsan",18,0));
   list1.add(new Student("lisi",28,0));
   list1.add(new Student("wangwu",24,1));
   //这里如果add(new Teacher(...));就会报错,因为我们已经给List指定了数据类型为Student
   show1(list1);

   System.out.println("************分割线**************");

   //这里我们并没有给List指定具体的数据类型,可以存放多种类型数据
   List list2 = new ArrayList<>();
   list2.add(new Student("zhaoliu",22,1));
   list2.add(new Teacher("sunba",30,0));
   show2(list2);
}
Copier après la connexion

来看看运行结果:

Student{name='zhangsan', age=18, sex=0}
Student{name='lisi', age=28, sex=0}
Student{name='wangwu', age=24, sex=1}
************分割线**************
Student{name='zhaoliu', age=22, sex=1}
Teacher{name='sunba', age=30, sex=0}

从show2方法可以看出和show1的区别了,list2存放了Student和Teacher两种类型,同样可以输出数据,所以这就是T和?的区别啦~小伙伴们了解了吧

下面来看看?的扩展写法:

List<? extends 数据类型> list

public static void show3(List<? extends Teacher> list) {
    for (Object object : list) {
        System.out.println(object);
    }
}
Copier après la connexion

List<? extends Teacher> list这种写法表示可以接收Teacher和它的子类数据类型的list集合,写个测试方法show3(list2);试试:

Student{name=&#39;zhaoliu&#39;, age=22, sex=1}
Teacher{name=&#39;sunba&#39;, age=30, sex=0}
Copier après la connexion

可以看到正常输出,因为集合中的数据都是Teacher的子类类型,如果我们将List<? extends Teacher> list改成List<? extends Student> list会出现什么情况?

Quelles sont les différences entre les espaces réservés T et ? dans les génériques Java ?

仔细看这张图,我们新建了一个list3并且声明数据类型为Teacher,这个时候调用show3(List<? extends Student> list) 就马上会报错的,错误信息提示Teacher不能转换成Student,因为Student是Teacher的子类,而我们只接受Student及它的子类,所以当然会报错了。

List<? super 数据类型> list

这种写法表示只接收指定的数据类型及它的父类类型,也简单的写段代码看看效果:

public static void show4(List<? super Student> list) {
    for (Object object : list) {
        System.out.println(object);
    }
}
Copier après la connexion

可以看出来,我们接收的是Student及它父类的集合,我们写两个集合数据然后调用试试。

List list4 = new ArrayList<>();
list4.add(new Student("sunba",30,0));
list4.add(new Teacher("zhaoliu",22,1));
show4(list4);
Copier après la connexion

在list中插入了一个Student和Teacher对象,看看结果:

Student{name=&#39;sunba&#39;, age=30, sex=0}
Teacher{name=&#39;zhaoliu&#39;, age=22, sex=1}
Copier après la connexion

没毛病,正常运行并输出。

下面我们来看看,如果我们是传递的 Student的子类的集合会咋样

Quelles sont les différences entre les espaces réservés T et ? dans les génériques Java ?

可以看到和之前的一样,会报错,理由也是一样的,以为我们已经定义了只能接收Student及其父类的数据类型。

最后来看一种情况

如果我定义List的时候没有指定数据类型,并且插入了一个Child,Student,Teacher,还是调用show4(List super Student> list)

Ressentons intuitivement la différence entre les deux à travers un morceau de code de test :

rrreeeQuelles sont les différences entre les espaces réservés T et ? dans les génériques Java ? Jetons un coup d'œil aux résultats en cours :

#🎜 🎜# Étudiant{name='zhangsan', age=18, sex=0}
Étudiant{name='lisi', age=28, sex=0}
Étudiant{name='wangwu', age= 24, sex=1}
************Ligne de séparation***************
Étudiant{name='zhaoliu ', age=22, sex=1}
Professeur{name='sunba', age=30, sex=0}

Vous pouvez voir la différence entre show1 et la méthode show2, list2 stocke deux types : Étudiant et Enseignant, et peut également générer des données, c'est donc la différence entre T et ?~ Les amis, comprenez-vous

Quelles sont les différences entre les espaces réservés T et ? dans les génériques Java ? Jetons un coup d'oeil ? Méthode d'écriture étendue :

List étend la liste des types de données>

rrreee#🎜🎜#List Cette façon d'écrire signifie que vous pouvez recevoir une liste de types de données Teacher et ses sous-classes. Écrivez une méthode de test <code>show3(list2); et essayez : #🎜🎜#rrreee#🎜🎜#Vous pouvez. voir Sortie normale, car les données de la collection sont toutes des sous-classes de Teacher. Si nous modifions List extends Teacher> en <code>List Ce qui se produit? #🎜🎜##🎜🎜#<img src="/static/imghw/default1.png" data-src="https://img.php.cn/upload/article/000/465/014/168379980974599.png" class="lazy" alt="Placeholder T et ? dans les génériques Java ? Que sont les différences?">#🎜🎜##🎜🎜#Regardez attentivement cette image. Nous avons créé une nouvelle liste3 et déclaré le type de données comme Enseignant. À ce stade, nous appelons <code>show3(List extends Student> list) signalera immédiatement une erreur. Le message d'erreur indique que Teacher ne peut pas être converti en Student, car Student est une sous-classe de Teacher, et nous n'acceptons que Student et ses sous-classes, donc bien sûr, une erreur sera signalé. #🎜🎜##🎜🎜#List super data type> list#🎜🎜##🎜🎜#Cette façon d'écrire signifie que seuls le type de données spécifié et son type parent sont reçus, et Écrivez simplement un morceau de code pour voir l'effet : #🎜🎜#rrreee#🎜🎜# On peut voir que ce que nous recevons est la collection de Student et de sa classe parent, écrivons deux collections de données puis appelons-la pour essayer. . #🎜🎜#rrreee#🎜🎜#Insérez un objet Étudiant et Enseignant dans la liste et voyez le résultat : #🎜🎜#rrreee#🎜🎜#Rien de mal, il fonctionne normalement et sort. #🎜🎜##🎜🎜#Voyons ce qui se passe si nous réussissons une collection de sous-classes d'étudiants#🎜🎜##🎜🎜#Quelles sont les différences entre les espaces réservés T et ? dans les génériques Java#🎜🎜##🎜🎜#Vous pouvez voir la même chose qu'avant, une erreur sera signalée pour la même raison , pensant que nous avons défini un type de données qui ne peut recevoir que Student et sa classe parent. #🎜🎜##🎜🎜#Enfin, regardons une situation #🎜🎜##🎜🎜#Si je ne spécifie pas de type de données lors de la définition de la liste et que j'insère un enfant, un étudiant, un enseignant, j'appelle toujours show4 ( List super Student> list), une erreur sera-t-elle signalée ? Si aucune erreur n’est signalée, quel sera le résultat ? #🎜🎜##🎜🎜##🎜🎜##🎜🎜##🎜🎜#Vous pouvez voir qu'aucune erreur n'est signalée car la liste peut stocker plusieurs types de données. Alors, quel sera le résultat lors de l'appel de la méthode show4 ? #🎜🎜##🎜🎜##🎜🎜##🎜🎜##🎜🎜#Vous pouvez voir que le programme s'exécute normalement et affiche les résultats. Notez que ce que nous recevons sont les types de données de l'objet Student et de sa classe parent, car. notre enfant Il hérite de Student, donc le programme convertit automatiquement notre enfant en classe parent Student pour la sortie, donc tout le monde doit y prêter attention, et il sera automatiquement converti vers le haut. #🎜🎜#

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 de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Nombre parfait en Java Nombre parfait en Java Aug 30, 2024 pm 04:28 PM

Guide du nombre parfait en Java. Nous discutons ici de la définition, comment vérifier le nombre parfait en Java ?, des exemples d'implémentation de code.

Weka en Java Weka en Java Aug 30, 2024 pm 04:28 PM

Guide de Weka en Java. Nous discutons ici de l'introduction, de la façon d'utiliser Weka Java, du type de plate-forme et des avantages avec des exemples.

Numéro de Smith en Java Numéro de Smith en Java Aug 30, 2024 pm 04:28 PM

Guide du nombre de Smith en Java. Nous discutons ici de la définition, comment vérifier le numéro Smith en Java ? exemple avec implémentation de code.

Questions d'entretien chez Java Spring Questions d'entretien chez Java Spring Aug 30, 2024 pm 04:29 PM

Dans cet article, nous avons conservé les questions d'entretien Java Spring les plus posées avec leurs réponses détaillées. Pour que vous puissiez réussir l'interview.

Break or Return of Java 8 Stream Forach? Break or Return of Java 8 Stream Forach? Feb 07, 2025 pm 12:09 PM

Java 8 présente l'API Stream, fournissant un moyen puissant et expressif de traiter les collections de données. Cependant, une question courante lors de l'utilisation du flux est: comment se casser ou revenir d'une opération FOREAK? Les boucles traditionnelles permettent une interruption ou un retour précoce, mais la méthode Foreach de Stream ne prend pas directement en charge cette méthode. Cet article expliquera les raisons et explorera des méthodes alternatives pour la mise en œuvre de terminaison prématurée dans les systèmes de traitement de flux. Lire plus approfondie: Améliorations de l'API Java Stream Comprendre le flux Forach La méthode foreach est une opération terminale qui effectue une opération sur chaque élément du flux. Son intention de conception est

Horodatage à ce jour en Java Horodatage à ce jour en Java Aug 30, 2024 pm 04:28 PM

Guide de TimeStamp to Date en Java. Ici, nous discutons également de l'introduction et de la façon de convertir l'horodatage en date en Java avec des exemples.

Programme Java pour trouver le volume de la capsule Programme Java pour trouver le volume de la capsule Feb 07, 2025 am 11:37 AM

Les capsules sont des figures géométriques tridimensionnelles, composées d'un cylindre et d'un hémisphère aux deux extrémités. Le volume de la capsule peut être calculé en ajoutant le volume du cylindre et le volume de l'hémisphère aux deux extrémités. Ce tutoriel discutera de la façon de calculer le volume d'une capsule donnée en Java en utilisant différentes méthodes. Formule de volume de capsule La formule du volume de la capsule est la suivante: Volume de capsule = volume cylindrique volume de deux hémisphères volume dans, R: Le rayon de l'hémisphère. H: La hauteur du cylindre (à l'exclusion de l'hémisphère). Exemple 1 entrer Rayon = 5 unités Hauteur = 10 unités Sortir Volume = 1570,8 unités cubes expliquer Calculer le volume à l'aide de la formule: Volume = π × r2 × h (4

Comment exécuter votre première application Spring Boot dans Spring Tool Suite? Comment exécuter votre première application Spring Boot dans Spring Tool Suite? Feb 07, 2025 pm 12:11 PM

Spring Boot simplifie la création d'applications Java robustes, évolutives et prêtes à la production, révolutionnant le développement de Java. Son approche "Convention sur la configuration", inhérente à l'écosystème de ressort, minimise la configuration manuelle, allo

See all articles