web-dev-qa-db-fra.com

Que signifie <T> (chevrons) en Java?

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?

121
Laughy

<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 Integers." 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:

  • Ma Pool<String> aurait une interface PoolFactory<String> avec une méthode createObject qui renvoie Strings.
  • En interne, le 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.

131
mgiuca

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).

20
Ruturaj Mohanty

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:

  1. Réduire le nombre d'incidents dans votre programme, réduisant ainsi le nombre de bogues potentiels dans votre programme.
  2. Améliorer la clarté du code
20
user831722

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.

9
Rafiek

<> 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.

7
Joachim Sauer

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.

5
Adiii