Bonjour. C'est Kecho. ** Utilisez-vous des génériques? ** ** J'ai appris pour la première fois aujourd'hui. Je veux dire, je ne l'avais jamais vu auparavant, mais je suis finalement tombé sur un endroit pour apprendre.
Je pense que celui que je rencontre le plus est la liste. Je pense que vous avez fait la déclaration suivante.
List<String> list = new ArrayList<>();
Je savais seulement que c'était un tableau de longueur variable. Les classes qui utilisent ce <> sont appelées classes génériques.
List<String> list
Tout d'abord, cette partie. List est une interface qui contient et gère plusieurs éléments comme un tableau ** en premier lieu. Non limité à String, différents types d'objets peuvent être stockés. (Un seul type.) Ainsi, la déclaration ci-dessus stipule que String sera stocké cette fois.
new ArrayList<>();
Ensuite cette partie. Le <> est vide, mais je l'omets simplement. (Le type peut être déduit de la chaîne sur le côté gauche)
Parlons des génériques dans une perspective plus large, pas seulement de la liste. La définition simple est la suivante.
public class Gene<T> {
private T t;
public void setT(T t) {
this.t = t;
}
public T getT() {
return t;
}
}
L'utilisation est la suivante
Gene<String> g1 = new Gene<>(); //Fixé avec le type String
Gene<Integer> g2 = new Gene<>(); //Fixé en tant que type Integer
g1.setT("test");
System.out.print(g1.getT()); // test
g2.setT(24);
System.out.print(g2.getT()); // 24
Dans cet exemple, nous avons pu utiliser plusieurs classes pour la même classe.
public class GeneObj {
Object t;
public void setT(Object t) {
this.t = t;
}
public Object getT() {
return t;
}
}
J'ai essayé d'utiliser la classe Object pour la partie limitée par le type T. Utilisons-le.
GeneObj g1 = new GeneObj();
GeneObj g2 = new GeneObj();
g1.setT("test");
System.out.print(g1.getT()); // test
g2.setT(24);
System.out.print(g2.getT()); // 24
Vous pouvez l'écrire avec un code similaire.
Dois-je utiliser des génériques? ?? ??
Les deux fonctionnent dans cet exemple, mais il y a un problème avec l'utilisation d'Object. En termes simples, cette classe est difficile à utiliser.
GeneObj g1 = new GeneObj(); //Fixé avec le type String
g1.setT("1");
Integer res = (Integer) g1.getT() + 1; //Occurrence de ClassCastException
System.out.print(res);
Ci-dessus, j'ai accidentellement compressé une chaîne au lieu d'un type Integer. Par conséquent, ClassCastException s'est produite lors de la conversion en classe Integer. Du point de vue de l'utilisateur, il doit connaître le type qu'il définit, qui est un foyer de bogues. ** Avec Generics, vous n'avez pas besoin d'utiliser un cast en premier lieu et vous pouvez le remarquer avec une erreur de compilation. ** **
Des génériques sont nécessaires pour équilibrer la flexibilité du type et la maintenabilité du code
Recommended Posts