• [^] # Re: Testez-le, ensuite vous pourrez critiquer

    Posté par . En réponse à la dépêche Quelques nouvelles rapides du langage Go. Évalué à 3.

    En Java, les templates demandent des informations sur les types paramétrés. Si l'on définit une classe ainsi :

    class Generique<K> {
    

    alors le contenu de la classe ne pourra rien exploiter du type K (autre que ce qui est présent dans Object). La classe Generique est compilée une seule fois. Si on utilise la classe Generique<String> dans une classe Exemple, le compilateur utilisera Generique et fera quelques transtypages (à la compilation, pas à l'exécution) en plus depuis Object vers String.
    Si l'on veut pouvoir utiliser des spécificités de K, comme par exemple utiliser une méthode charAt, il faudra définir une interface Caracteres à l'avance et définir ainsi :

    class Generique<K extends Caracteres> {
    

    En C++, une classe à template est recompilée pour chaque instanciation différente de template. C'est pour cela que les classes à templates doivent être placées dans des entêtes (.h, certains compilateurs ne sont pas restreints ici, mais ils sont rares). Comme la classe Generique n'est réellement compilée qu'au moment où le compilateur a les informations sur le type paramètre, et qu'un type dédié est créé, le compilateur fait les remplacement comme une macro, aucune déclaration d'interface n'est nécessaire. std::list<int> est une entité bien différente de std::list<bool>, contrairement à ArrayList<Integer> et ArrayList<Boolean> qui sont la même.

    template <typename T>
    T somme(T a, T b) {
     return a + b;
    }
    

    On pourra utiliser tous les types qui ont un opérateur "+" (et dont le prototype est en accord), sans besoin de déclarer de façon spéciale toutes les classes (sans interface à la Java) que l'on voudra utiliser avec "somme".