162 votes

Que signifie <T> (crochets) en Java ?

J'étudie actuellement le langage Java et j'ai récemment été déconcerté par les crochets (<>). 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> C'est-à-dire ? Cela signifie-t-il que je peux créer un objet de type T ?

4 votes

Je trouve difficile d'analyser votre code. Il n'y a pas d'indentation pour commencer, et il y a deux accolades ouvertes et une seule fermée. Est-ce que T createObject est censé se trouver à l'intérieur de Pool ou de PoolFactory ? Où se trouve this.freeObjects = ... est censé être ? S'agit-il d'un exemple distinct ? Il est illégal de l'avoir à cet endroit ; il doit être à l'intérieur d'une méthode.

1 votes

Si quelqu'un cherche des informations sur <> (opérateur diamant) qui pourrait être utilisé comme List<Integer> list = new ArrayList<>(); visitez docs.oracle.com/javase/7/docs/technotes/guides/language/ .

187voto

mgiuca Points 10265

<T> est un Générique et peut généralement être lu comme "de type T". Ce que cela signifie réellement dépend du type à gauche du <>.

Je ne sais pas ce qu'un Pool o PoolFactory est, mais vous mentionnez également ArrayList<T> qui est une classe Java standard, je vais donc en parler.

En général, vous ne verrez pas "T", mais un autre type. Donc si vous voyez ArrayList<Integer> par exemple, qui 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> ce qui signifie "une carte avec String et Integer valeurs."

L'exemple de votre Pool est un peu différent, car il s'agit de définir une classe. 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 la définition de votre classe. Cela voudrait dire deux choses :

  • Mon Pool<String> aurait une interface PoolFactory<String> avec un createObject qui renvoie String s.
  • En interne, le Pool<String> contiendrait un ArrayList de cordes.

C'est une bonne nouvelle, parce qu'à un autre moment, je pourrais arriver et créer un Pool<Integer> qui utiliserait le même code, mais aurait Integer partout où vous voyez T dans la source.

3 votes

L'une des meilleures explications que j'ai vues jusqu'à présent :) Très apprécié !

45voto

Ruturaj Mohanty Points 391

C'est très simple. Il s'agit d'une nouvelle fonctionnalité introduite dans J2SE 5 . Le fait de spécifier des parenthèses angulaires après le nom de la classe signifie que vous créez un type de données temporaire qui peut 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 en fait écrire n'importe quoi et cela fonctionnera de la même manière. Essayez d'écrire <ABC> à la place de <T> .

C'est juste pour la commodité :

  • <T> est désigné comme n'importe quel type
  • <E> comme type d'élément
  • <N> comme type de numéro
  • <V> comme valeur
  • <K> comme clé

Mais tu peux l'appeler comme tu veux, ça n'a pas vraiment d'importance.

De plus, Integer , String , Boolean etc. sont des classes enveloppantes de Java qui aident à la vérification des types lors de la compilation. Par exemple, dans le code ci-dessus, obj est de type String Vous ne pouvez donc pas y ajouter d'autres types (essayez l'option obj.add(1) une erreur sera générée). De même, obj1 est de la Integer vous ne pouvez pas y ajouter un autre type (essayez obj1.add("hello") l'erreur sera là).

26voto

C'est lié aux génériques en Java. Si je mentionne ArrayList<String> cela signifie que je ne peux ajouter que des objets de type String à cette ArrayList.

Les deux principaux avantages des génériques en Java sont :

  1. Réduire le nombre de casts dans votre programme, ce qui réduit le nombre de bogues potentiels dans votre programme.
  2. Améliorer la clarté du code

12voto

Rafiek Points 135

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 des types primitifs comme int ou double ou char ou d'autres types primitifs.

9voto

Joachim Sauer Points 133411

<> 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 pouvez faire. ne peut pas faire avec T .

En dehors du tutoriel lié ci-dessus Angelika Langers FAQ sur les génériques est une excellente ressource sur le sujet.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X