485 Shares 5592 views

Java Generics: description et méthodes

En commençant par l'apparition du langage Java a subi beaucoup de changements, qui a sans doute apporté des moments positifs dans sa fonctionnalité. L'un de ces changements importants est l'introduction de Java générique ou des généralisations. Cette fonctionnalité fait non seulement la langue plus souple et polyvalent, mais aussi beaucoup plus sûr en termes d'amener les types de données.

Le fait est que, avant l'introduction de médicaments génériques en Java code générique pourrait être créé, non seulement en termes d'objet de référence de type. De tels liens peuvent être attribués tout objet. Après tout, les classes Java sont les héritiers implicites de classe d'objets. Cependant, cette approche est une source potentielle de nombreuses erreurs liées aux types de sécurité dans la conversion apparente d'un objet à partir de l'objet du type de cible. Lors de l'utilisation des généralisations toutes les moulages sont effectuées implicitement et automatiquement, éliminant même le risque d'erreurs.

Java Generics: description et exemple

Considérons un exemple simple de l'application de la généralisation à des classes régulières dans la figure ci-dessous. Et puis procéder à un examen détaillé de toutes les subtilités et les nuances de Java générique.

Faites attention à la façon dont la déclaration de classe se produit Paire. Immédiatement après le nom de la classe, les crochets ouverts, ce qui indique la lettre T. Il est une sorte de charge, ce qui est en train de créer une instance de cette classe sera remplacé par un type spécifique. Il se présente comme suit: Paire obj = nouvelle paire (). Il convient de noter que, au lieu de T peut spécifier une lettre, mais, en règle générale, utilisez T, V ou E.

Note: en commençant par la huitième version de Java, en spécifiant le type de cible lors de la déclaration équerres de référence dans le constructeur peut rester vide. Ainsi, par exemple peut être réécrite comme ci-dessus: Paire obj = nouvelle paire ().

Quand une classe est déclarée de telle manière, puis dans son corps au lieu de certains types de champs, des liens, des objets retournés par les méthodes que vous pouvez utiliser cette lettre. Depuis T lors de la création de l'objet de classe est remplacé par un type particulier, premier et deuxième champs dans ce cas seront de type entier.

Suivant la logique des arguments et firstItem secondItem, par rapport au constructeur approprié doit également être de type entier ou sous-classe. Si vous essayez de transmettre un type de données qui est différent de ce qui a été spécifié lors de la création d'un objet, le compilateur ne laissera pas cette erreur. Ainsi, le constructeur d'arguments quand un objet sera comme suit: Paire obj = nouvelle paire (new Integer (1), new Integer (2)). De même pour les arguments et les méthodes setFirst setSecond. Et comme vous l'avez probablement deviné, les méthodes getFirst getSecond et renvoie une valeur de type entier.

Généralisée avec plusieurs paramètres types de classe

Dans les classes généralisées peuvent également déclarer des paramètres multiples du type qui sont mis entre crochets par une virgule. Refonte par une affaire de classe paire est présentée ci-dessous.

Comme vous pouvez le voir, lorsque vous créez une instance de cette classe entre crochets doit indiquer le même nombre de types comme paramètres. Si vous êtes familier avec ce type de structure de données d'une carte, vous pouvez voir qu'il utilise exactement le même principe. Là, le premier argument spécifie le type de clé, et le second – le type de valeur. Il convient de noter que les types de transmission lorsqu'un objet d'arguments peuvent se chevaucher. Par exemple, la paire instance de classe d'annonce suivante est tout à fait correct: Paire obj.

Certaines caractéristiques des généralisations

Avant d'aller plus loin, il convient de noter que le compilateur Java ne crée pas différentes versions de la paire de classe. En fait, dans le processus de compilation d'un type généralisé toutes les informations sont supprimées. Au lieu de cela, vous apportez les types appropriés, la création d'une version spéciale de la classe paire. Cependant, dans le programme il n'y a encore qu'une version générique de la classe. Ce processus est appelé en Java de type générique de nettoyage.

Remarque un point important. Liens vers les différentes versions de la même classe Java générique ne peut pas pointer vers un seul et même objet. Autrement dit, supposons que nous avons deux liens: Pair obj1 et Paire obj2. Par conséquent, conformément obj1 = obj2 une erreur. Bien que les deux variables sont de type paire , les objets auxquels ils se réfèrent, sont différents. Ceci est un exemple des types de sécurité en Java générique.

Restrictions sur les classes génériques

Il est important de savoir que les généralisations peuvent être appliquées que pour référencer les types, qui est de passer des paramètres argument java classe générique doit être un type de classe. Ces types simples, tels que, par exemple, double ou longues, ne peuvent pas être transférés. En d'autres termes, la déclaration de classe de ligne suivante paire n'est pas autorisé: Paire obj. Toutefois, cette limitation est pas un problème grave, car il y a une classe wrapper Java correspondant pour chaque type primitif. Strictement parlant, si la paire de classe que vous souhaitez encapsuler un entier et la valeur booléenne avtoupakovka fait tout pour vous: Paire obj = nouvelle paire (25, true).

Une autre limitation grave est l'incapacité de créer une instance du type de paramètre. Par exemple, la ligne suivante provoque une erreur de compilation: T première = new T (). Cela est évident, parce que vous ne savez pas à l'avance si un argument a adopté une classe complète ou abstraite, ou même interface. La même chose vaut pour la création de tableaux.

types limités

Très souvent, il y a des situations où il est nécessaire de limiter la liste des types qui peuvent être transmis comme argument à la classe Java générique. Supposons que dans notre paire de classe que nous voulons résumer uniquement les valeurs numériques pour d'autres opérations mathématiques sur eux. Pour ce faire, nous devons définir la limite supérieure du type de paramètre. Il est réalisé au moyen d'une superclasse annonces héritées tous les arguments passés entre crochets. Il se présente comme suit: classe paire . De cette manière, le compilateur trouve que, au lieu du paramètre T peut être substitué ou une catégorie de numéro ou un de ses sous-classes.

Ceci est une réception commune. De telles restrictions sont souvent utilisées pour fournir des paramètres de type de compatibilité dans une seule et même classe. Prenons l'exemple dans notre classe Paire: Paire classe . Ici, nous disons au compilateur que le type T peut être arbitraire, et le type V doit être soit T ou un de ses sous-classes.

La limitation du « bas » est exactement de la même manière, mais au lieu du mot étend à épeler le mot super. C'est classé classe paire dit qu'au lieu de T peut être substitué ou un ArrayList ou une classe ou une interface qu'il hérite.

Les méthodes Java génériques et les constructeurs

En Java, les généralisations peuvent être appliquées non seulement aux classes, mais aussi des méthodes. Par exemple, une méthode générique peut être déclarée dans une classe régulière.

Comme on le voit dans la figure ci-dessus, la méthode publicitaire généralisée est pas grand. Suffisamment avant que le type de retour d'une méthode pour placer les supports d'angle et de spécifier les paramètres de type en eux.

Si tout est fait de façon similaire au constructeur:

Les crochets angulaires dans ce cas, mettre avant le nom du concepteur, parce qu'il n'a pas de valeur de retour. Le résultat des deux programmes sera:

entier

chaîne