J'étudie actuellement Java) et j'ai récemment été surpris par les chevrons (<>). Que signifient-ils exactement?
public class Pool<T>{
public interface PoolFactory<T>{
public T createObject();
}
this.freeObjects= new ArrayList<T>(maxsize)
}
Que fait le <T>
signifier? Est-ce que cela signifie que je peux créer un objet de type T
?
<T>
est un générique et peut généralement être lu comme "de type T". Cela dépend du type situé à gauche de <> ce que cela signifie réellement.
Je ne sais pas ce qu'est un Pool
ou PoolFactory
, mais vous mentionnez aussi ArrayList<T>
, qui est une classe Java) standard, je vais donc en parler.
Habituellement, vous ne verrez pas le "T" ici, vous verrez un autre type. Donc, si vous voyez ArrayList<Integer>
_ par exemple, cela signifie "Un ArrayList
de Integer
s." De nombreuses classes utilisent des génériques pour contraindre le type des éléments d'un conteneur, par exemple. Un autre exemple est HashMap<String, Integer>
, qui signifie "une carte avec String
clés et Integer
valeurs."
Votre exemple de Pool est un peu différent, car vous définissez une classe. Donc, dans ce cas, vous créez une classe que quelqu'un d'autre pourrait instancier avec un type particulier à la place de T. Par exemple, je pourrais créer un objet de type Pool<String>
en utilisant votre définition de classe. Cela voudrait dire deux choses:
Pool<String>
aurait une interface PoolFactory<String>
avec une méthode createObject
qui renvoie String
s.Pool<String>
contiendrait un ArrayList
de chaînes.C'est une bonne nouvelle, car à un autre moment, je pourrais venir créer un Pool<Integer>
qui utiliserait le même code, mais aurait Integer
partout où vous verrez T
dans le code source.
C'est vraiment simple. C'est une nouvelle fonctionnalité introduite dans J2SE 5. Spécifier des crochets angular après le nom de la classe) signifie que vous créez un type de données temporaire pouvant contenir n’importe quel type de données.
Exemple:
class A<T>{
T obj;
void add(T obj){
this.obj=obj;
}
T get(){
return obj;
}
}
public class generics {
static<E> void print(E[] elements){
for(E element:elements){
System.out.println(element);
}
}
public static void main(String[] args) {
A<String> obj=new A<String>();
A<Integer> obj1=new A<Integer>();
obj.add("hello");
obj1.add(6);
System.out.println(obj.get());
System.out.println(obj1.get());
Integer[] arr={1,3,5,7};
print(arr);
}
}
Au lieu de <T>
, Vous pouvez réellement écrire n'importe quoi et cela fonctionnera de la même manière. Essayez d'écrire <ABC>
À la place de <T>
.
Ceci est juste pour plus de commodité:
<T>
Est appelé n'importe quel type<E>
Comme type d'élément<N>
Comme type de numéro<V>
Comme valeur<K>
Comme cléMais vous pouvez nommer ce que vous voulez, cela n'a pas d'importance.
De plus, Integer
, String
, Boolean
etc sont des classes wrapper de Java qui aident à vérifier les types lors de la compilation. Par exemple, dans le code ci-dessus, obj
est de type String
, vous ne pouvez donc y ajouter aucun autre type (essayez obj.add(1)
, il générera une erreur). obj1
Est du type Integer
, vous ne pouvez y ajouter aucun autre type (essayez obj1.add("hello")
, l'erreur sera présente).
Il est lié aux génériques en Java. Si j'ai mentionné ArrayList<String>
_ cela signifie que je ne peux ajouter que des objets de type String à cet ArrayList.
Les deux principaux avantages des génériques dans Java sont:
est appelé un type générique. Vous pouvez instancier un objet Pool comme ceci:
PoolFactory<Integer> pool = new Pool<Integer>();
Le paramètre générique ne peut être qu'un type de référence. Vous ne pouvez donc pas utiliser de types primitifs tels que int ou double ou char ou d'autres types primitifs.
<>
est utilisé pour indiquer génériques en Java.
T
est un paramètre de type dans cet exemple. Et non: l'instanciation est l'une des rares choses que vous ne pouvez pas faire avec T
.
Mis à part le tutoriel lié ci-dessus FAQ Angelika Langers Generics est une excellente ressource sur le sujet.
Les classes génériques sont un type de classe qui prend un type de données en tant que paramètre lors de sa création. Ce paramètre de type est spécifié à l'aide de chevrons et le type peut changer chaque fois qu'une nouvelle instance de la classe est instanciée. Par exemple, créons une ArrayList pour les objets Employee et une autre pour les objets Company.
ArrayList<Employee> employees = new ArrayList<Employee>();
ArrayList<Company> companies = new ArrayList<Company>();
Vous remarquerez que nous utilisons la même classe ArrayList pour créer les deux listes et nous passons dans le type Employee ou Company à l'aide de chevrons. Avoir une classe générique capable de gérer plusieurs types de données réduit le nombre de classes effectuant des tâches similaires. Les génériques aident également à réduire les bugs en donnant à tous un type fort qui aide le compilateur à signaler les erreurs. En spécifiant un type pour ArrayList, le compilateur génère une erreur si vous essayez d'ajouter un employé à la liste de l'entreprise ou inversement.