Maison Java javaDidacticiel Java – Génériques

Java – Génériques

Jun 27, 2017 am 09:13 AM
泛型

Utilisez des crochets angulaires pour spécifier les paramètres de type formel. La relation entre les paramètres de type formel et les paramètres de type réels est similaire à la relation entre les paramètres de méthode formelle et les paramètres de méthode réels, sauf que les paramètres de type représentent des types plutôt que des valeurs.

Paramètres de type nommés

La convention de dénomination recommandée consiste à utiliser des noms majuscules à une seule lettre pour les paramètres de type. Cela diffère de la convention C++ (voir Annexe A : Comparaison avec les modèles C++) et reflète l'hypothèse selon laquelle la plupart des classes

génériques

auront un petit nombre de paramètres de type. Pour le modèle

générique commun, le nom recommandé est : K - clé, telle qu'une clé mappée. V - Valeur, telle que le contenu de List et Set, ou la valeur dans Map.

E ——Classe d'exception.

T ——

Générique

.


1. Pourquoi utiliser des génériques

方法签名由方法名称和一个参数列表(方法的参数的顺序和类型)组成。
Copier après la connexion

1. Il n'y a aucune limite quant aux éléments pouvant être insérés. L'insertion de deux objets différents peut provoquer des exceptions.

2. Jetez l'objet dans la collection. La collection perd les informations d'état de l'objet. La collection sait seulement qu'elle contient l'objet, donc après l'avoir retiré. les éléments de collection, la conversion forcée est généralement également requise

2. Que sont les génériques

Les types paramétrés de Java sont appelés génériques, qui permettent au programme de spécifier le type d'éléments de collection lors de la création d'une collection

3. La syntaxe générique du diamant

doit seulement être suivie d'une paire de supports en diamant, pas besoin pour les génériques

4. Créez une classe personnalisée avec une déclaration générique lors de la définition d'un constructeur pour la classe, le nom du constructeur doit toujours être le nom de la classe d'origine. .

5. Dériver une sous-classe d'une classe générique Lors de l'héritage, vous devez transmettre les paramètres réels de la classe parent

la classe publique A étend Apple{}

Toutes les méthodes qui remplacent la classe parent deviennent le type correspondant

Vous pouvez également transmettre aucun paramètre réel

la classe publique A étend Apple{}

Traité comme type d'objet

6.

Peu importe les paramètres de type réels d'un générique, ils ont toujours la même classe au moment de l'exécution. Quel que soit le type de paramètre réel passé dans le paramètre de type générique, (

réside dans le but du concept de génériques en Java, ce qui l'amène à n'agir que dans la phase de compilation du code. Pendant le processus de compilation , Une fois le résultat générique correctement vérifié, les informations pertinentes du générique seront effacées, c'est-à-dire que le fichier de classe compilé avec succès ne contient aucune information générique et les informations génériques n'entreront pas dans l'étape d'exécution

<.>.) Pour Java, ils sont toujours traités comme la même classe et occupent un espace mémoire dans la mémoire. Par conséquent, les types ne peuvent pas être utilisés dans la déclaration et l'initialisation de méthodes statiques, de blocs d'initialisation statiques ou de variables formelles statiques. paramètres

                                                                                     

Les variables statiques sont partagées par toutes les instances d'une classe générique. Pour une classe déclarée comme MyClass, la méthode permettant d'accéder aux variables statiques qu'elle contient est toujours MyClass.myStaticVar. Que les objets soient créés via le nouveau MyClass ou le nouveau MyClass, ils partagent tous une variable statique. Supposons que les paramètres de type soient autorisés en tant que types de variables statiques. Considérons ensuite la situation suivante :

MaClasse class1 = nouvelle MaClasse();

MaClasse ;Integer>();

class1.myStaticVar = "bonjour";

class2.myStaticVar = 5;

En raison de l'effacement du type du générique système Sauf (type effacement). myStaticVar est restauré au type Object, puis lorsque class1.myStaticVar= "hello"; est appelé, le compilateur effectue une conversion de type forcée, c'est-à-dire myStaticVar = (String)"hello"; appelé, le compilateur continue d'effectuer une conversion de type forcée. , myStaticVar = (Integer)Integer.valueOf(5); À ce stade, myStaticVar est de type String. Bien sûr, cette instruction lancera une exception ClassCastException au moment de l'exécution. tapez un problème de sécurité. Par conséquent, le système générique ne permet pas aux variables statiques d’une classe d’utiliser des paramètres de type comme types de variables.

Les classes génériques ne seront pas réellement générées dans le système, donc la classe générique ne peut pas être utilisée après l'opérateur instanceod car elle n'existe pas du tout !

7. Tapez des caractères génériques

Notez que, si Foo est un sous-type de Bar et G est une classe ou une interface avec une déclaration générique, G n'est pas un sous-type de G.

En supposant que List peut être logiquement considérée comme la classe parent de List, alors a.test(list) n'aura pas d'erreur message , alors la question se pose : de quel type sont les données lorsqu'elles sont récupérées via la méthode getData() ? Entier ? Flotteur ? Ou Objet ? Et en raison de l'ordre incontrôlable du processus de programmation, un jugement de type et une conversion de type forcée doivent être effectués lorsque cela est nécessaire. Évidemment, cela contredit le concept de génériques. Par conséquent, ne peut logiquement pas être considéré comme la classe parent de List

Afin de représenter la classe parent de diverses collections génériques, vous pouvez utiliser des caractères génériques de type, qui sont un point d'interrogation, il peut correspondre à n'importe quel type :

Les caractères génériques de type sont généralement utilisés à la place des paramètres réels de type spécifique. Notez que voici les paramètres de type réels, pas les paramètres de type ! Et List est logiquement la classe parent de List, List

>... et de tous les List. À partir de là, nous pouvons encore définir des méthodes génériques pour répondre à ces exigences.

Quel que soit le type réel de la liste, elle contient un objet

Remarque : avec des caractères génériques, cela signifie uniquement C'est la classe parent de diverses collections génériques et ne peut pas y ajouter d'éléments

ne connaît pas le type d'éléments de la collection c et ne peut pas y ajouter d'objets

7.1 Définir la limite supérieure des caractères génériques

Étant donné que List n'est pas un sous-type de List, une erreur de compilation se produit

Ceci peut être recyclé. Utilisez des caractères génériques restreints

7.2 Définir la limite supérieure des paramètres de type

8. Méthodes génériques

Définir la classe, les paramètres de type ne sont pas utilisés dans l'interface lors de la définition des méthodes, je souhaite définir

méthodes statiques génériques indépendantes en même temps sans considérer plusieurs. -threading.point, il ne sera initialisé et appelé qu'une seule fois, il n'y aura pas d'initialisation superposée ni d'appels incorrects, et il n'y aura pas de situation comme la lecture de données sales dans la base de données, donc il n'y aura pas d'erreurs de code dans la conversion de type forcée.

Les paramètres formels définis dans la déclaration de la méthode ne peuvent être utilisés que dans cette méthode.

Contrairement aux classes et aux interfaces, les génériques dans les méthodes n'ont pas besoin d'afficher les paramètres de type réels transmis

Le compilateur ne doit pas être confus quant au type que vous transmettez

Pour exemple, test a, Collection

Si vous transmettez un type String ou un type Object, le compilateur ne sait pas de quel type est votre T

Peut-il être modifié en a, Collection

Méthode générique

(dans le paramètre de type une section) Vous avez vu que vous pouvez rendre une classe générique en ajoutant une liste de paramètres de type formel à sa définition. Les méthodes peuvent également être génériques, que la classe dans laquelle elles sont définies soit générique ou non.

Les classes génériques appliquent des contraintes de type sur plusieurs signatures de méthodes. Dans List, le paramètre de type V apparaît dans les signatures de méthodes telles que get(), add(), contain(), etc. Lorsque vous créez une variable de type Map, vous déclarez une contrainte de type entre les méthodes. La valeur que vous transmettez à add() sera du même type que la valeur renvoyée par get().

De même, une méthode générique est généralement déclarée car vous souhaitez déclarer une contrainte de type sur plusieurs paramètres de la méthode. Par exemple, la méthode ifThenElse() dans le code suivant renverra soit le deuxième, soit le troisième paramètre en fonction de la valeur booléenne de son premier paramètre :

public T ifThenElse(booléen b, T premier, T seconde) {
retour b : seconde ;
}

Notez que vous pouvez appeler ifThenElse() sans indiquer explicitement au compilateur ce que vous voulez pour la valeur T. Le compilateur n'a pas besoin de savoir explicitement quelles valeurs T aura ; il sait simplement que les valeurs doivent toutes être les mêmes. Le compilateur vous permet d'appeler le code suivant car le compilateur peut utiliser l'inférence de type pour déduire que la chaîne substituée à T satisfait toutes les contraintes de type :

String s = ifThenElse(b, "a", "b");

De même, vous pouvez appeler :

Integer i = ifThenElse(b, new Integer(1), new Integer(2));

Cependant, compilation Le code suivant n'est pas autorisé par le compilateur car aucun type ne satisferait les contraintes de type requises :

String s = ifThenElse(b, "pi", new Float ( 3.14));

Pourquoi avez-vous choisi d'utiliser une méthode générique au lieu d'ajouter le type T à la définition de la classe ? Il y a (au moins) deux cas où cela doit être fait :

Lorsqu'une méthode générique est statique, les paramètres de type classe ne peuvent pas être utilisés dans ce cas.

Lorsqu'une contrainte de type sur T est vraiment locale à une méthode, cela signifie qu'il n'y a pas d'utilisation du même type T dans une autre signature de méthode du même contrainte de classe. La signature d'un type fermé peut être simplifiée en rendant les paramètres de type d'une méthode générique locaux à la méthode.


Type restreint

Méthode générique dans l'écran précédent Dans l'exemple , le paramètre de type V est un type sans contrainte ou sans restriction. Il est parfois nécessaire de spécifier des contraintes supplémentaires sur les paramètres de type lorsque ceux-ci n'ont pas été entièrement spécifiés.

Considérez l'exemple de classe Matrix, qui utilise un paramètre de type V, qui est délimité par la classe Number :

classe publique Matrix { ... }

Le compilateur vous permet de créer Matrix ;Float>, mais si vous essayez de définir une variable de type Matrix, une erreur se produira. Le paramètre de type V est évalué comme étant limité par Number . En l'absence de restrictions de type, les paramètres de type sont supposés être restreints par Object. C'est pourquoi l'exemple de l'écran précédent, Méthodes génériques, permet à List.get() de renvoyer Object lorsqu'il est appelé sur une List, même si le compilateur ne connaît pas le type du paramètre de type V.

9. La différence entre les méthodes génériques et les caractères génériques de type

Si une méthode Si le type de paramètre formel (a) ou le type de la valeur de retour dépend du type d'un autre paramètre formel (b), alors la déclaration de type du paramètre formel (b) ne doit pas utiliser de caractères génériques. Seuls les paramètres de type peuvent être déclarés dans la signature de la méthode. , c'est-à-dire une méthode générique.

Ce que je comprends, c'est que le caractère générique de type n'a pas besoin d'ajouter ou de modifier les éléments de la collection, et il est attaché aux autres plutôt qu'aux autres qui lui sont attachés. Utilisez .

Les caractères génériques de type peuvent être utilisés pour définir le type de paramètres formels dans les signatures de méthodes ou pour définir les types de variables dans les méthodes génériques doivent être explicitement déclarées dans la méthode correspondante.

10. Effacement et conversion

Lors de l'attribution d'un objet avec des informations génériques à un autre Lors de l'ajout d'un variable sans informations génériques, toutes les informations de type entre crochets angulaires sont supprimées.

Lors de l'attribution de li à List, le compilateur effacera le Les informations génériques du premier, c'est-à-dire perdre les informations de type des éléments de la collection de listes.

Java permet également à l'objet liste d'être directement affecté à une variable List, de sorte que le programme peut être compilé et passé, mais émet uniquement une "conversion non vérifiée" (en modifiant la logique classe parent directement affectée à la sous-classe), mais la variable list fait en fait référence à la collection list, donc lorsque vous essayez de supprimer les éléments de la collection en tant qu'objet de type String, cela déclenchera un exécuter l'exception

11. Génériques et tableaux

Les génériques Java ont un principe de conception très important : si un morceau de code ne génère pas d'avertissement « exception non convertie » lors de la compilation, le programme ne provoquera pas d'exception ClassCastException. Pour cette raison, Le type de tous les éléments du tableau ne peut pas contenir de variables de type ou de paramètres de type, à moins qu'il ne s'agisse d'un caractère générique de type illimité, mais le type d'élément peut être déclaré comme contenant un tableau de variables de type ou de paramètres de type

En supposant que cela puisse passer, cela ne provoquera aucun avertissement, mais provoquera une exception

Changez au format suivant :

La première ligne aura un avertissement "conversion non vérifiée", et la dernière ligne lancera également une exception

Créer des caractères génériques illimités Le tableau générique

n'émettra aucun avertissement lors de la compilation, mais une exception sera levée au moment de l'exécution car le programme doit forcer le premier élément de collection du premier élément de tableau de type lsa Convert to String, le programme doit donc utiliser l'opérateur instanceof pour garantir son type de données

De même, créer un objet tableau dont le type d'élément est un type variable provoquera également une erreur de compilation

T[] makeArray(Collection coll)

{ return new T[cool.size()]

>

La variable de type n'existe pas au moment de l'exécution et le compilateur ne peut pas déterminer quel est le type réel

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.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Comment déverrouiller tout dans Myrise
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

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)

Les fonctions génériques résolvent-elles le problème des types de paramètres variadiques dans Golang ? Les fonctions génériques résolvent-elles le problème des types de paramètres variadiques dans Golang ? Apr 16, 2024 pm 06:12 PM

Les fonctions génériques dans Go résolvent le problème des types variadiques : les fonctions génériques permettent de spécifier les paramètres de type au moment de l'exécution. Cela permet d'écrire des fonctions capables de gérer des arguments de différents types. Par exemple, la fonction Max est une fonction générique qui accepte deux paramètres comparables et renvoie la plus grande valeur. En utilisant des fonctions génériques, nous pouvons écrire du code plus flexible et général capable de gérer différents types de paramètres.

Scénarios d'application spécifiques des génériques dans Golang Scénarios d'application spécifiques des génériques dans Golang May 04, 2024 am 11:45 AM

Scénarios d'application des génériques dans Go : Opérations de collecte : Créez des opérations de collecte adaptées à tout type, comme le filtrage. Structures de données : écrivez des structures de données à usage général telles que des files d'attente, des piles et des cartes pour stocker et manipuler divers types de données. Algorithmes : écrivez des algorithmes à usage général tels que le tri, la recherche et la réduction qui peuvent gérer différents types de données.

Quelles sont les limites supérieure et inférieure des fonctions génériques Java ? comment utiliser? Quelles sont les limites supérieure et inférieure des fonctions génériques Java ? comment utiliser? Apr 26, 2024 am 11:45 AM

Les fonctions génériques Java permettent de définir des limites supérieures et inférieures. Extends spécifie que le type de données accepté ou renvoyé par une fonction doit être un sous-type du type spécifié, par ex. La limite inférieure (super) spécifie que le type de données accepté ou renvoyé par une fonction doit être un supertype du type spécifié, par ex. L'utilisation de génériques améliore la réutilisabilité et la sécurité du code.

Explorez les avantages et les utilisations des génériques à Golang Explorez les avantages et les utilisations des génériques à Golang Apr 03, 2024 pm 02:03 PM

Réponse : Les génériques Golang sont un outil puissant pour améliorer la réutilisabilité, la flexibilité, la sécurité des types et l'évolutivité du code. Description détaillée : Avantages : Réutilisabilité du code : algorithmes et structures de données communs Flexibilité : création d'instances de types spécifiques au moment de l'exécution Sécurité des types : vérification du type au moment de la compilation Extensibilité : facile à étendre et à personnaliser Objectif : fonctions communes : tri, comparaison Structures de données communes telles que les listes , cartes, piles, etc. Alias ​​de type : simplifiez les déclarations de type Génériques contraints : assurez la sécurité des types

Quelles sont les limitations des fonctions génériques dans Golang ? Quelles sont les limitations des fonctions génériques dans Golang ? Apr 16, 2024 pm 05:12 PM

Limitations des fonctions génériques Go : seuls les paramètres de type sont pris en charge, les paramètres de valeur ne sont pas pris en charge. La récursion des fonctions n'est pas prise en charge. Les paramètres de type ne peuvent pas être spécifiés explicitement, ils sont déduits par le compilateur.

Application des génériques Java dans le développement Android Application des génériques Java dans le développement Android Apr 12, 2024 pm 01:54 PM

L'application de génériques dans le développement Android améliore la réutilisabilité, la sécurité et la flexibilité du code. La syntaxe consiste à déclarer une variable de type T qui peut être utilisée pour manipuler des données paramétrées par type. Les génériques en action incluent des adaptateurs de données personnalisés, permettant à l'adaptateur de s'adapter à tout type d'objet de données personnalisé. Android fournit également des classes de listes génériques (telles que ArrayList) et des méthodes génériques permettant la manipulation de paramètres de différents types. Les avantages de l'utilisation de génériques incluent la réutilisabilité, la sécurité et la flexibilité du code, mais il faut veiller à spécifier les limites correctes et à les utiliser avec modération pour garantir la lisibilité du code.

Quel est l'impact des génériques Golang sur les signatures et les paramètres des fonctions ? Quel est l'impact des génériques Golang sur les signatures et les paramètres des fonctions ? Apr 17, 2024 am 08:39 AM

L'impact des génériques sur les signatures et les paramètres des fonctions Go comprend : Paramètres de type : les signatures de fonction peuvent contenir des paramètres de type, spécifiant les types que la fonction peut utiliser. Contraintes de type : les paramètres de type peuvent avoir des contraintes qui spécifient les conditions qu'ils doivent satisfaire. Inférence de type de paramètre : le compilateur peut déduire le type de paramètres de type non spécifiés. Spécification des types : les types de paramètres peuvent être explicitement spécifiés pour appeler des fonctions génériques. Cela augmente la réutilisabilité et la flexibilité du code, vous permettant d'écrire des fonctions et des types pouvant être utilisés avec plusieurs types.

Les paramètres variables Golang peuvent-ils être utilisés dans des fonctions génériques ? Les paramètres variables Golang peuvent-ils être utilisés dans des fonctions génériques ? Apr 29, 2024 pm 02:06 PM

Dans Go, les paramètres variadiques peuvent être utilisés pour des fonctions génériques, permettant la création de fonctions génériques acceptant un nombre variable de paramètres et adaptées à plusieurs types. Par exemple, vous pouvez créer une fonction générique Mode qui recherche l'élément le plus fréquent dans une liste donnée : Mode accepte un nombre variable d'éléments de type T. Il compte les éléments en créant des comptes pour chaque élément. Ensuite, il trouve l'élément qui apparaît le plus et le renvoie en mode. Dans la fonction principale, vous pouvez appeler la fonction Mode pour la liste de chaînes et la liste d'entiers, qui renverront respectivement la chaîne et le nombre avec le plus d'occurrences.

See all articles