Maison  >  Article  >  Java  >  Est-ce un bug de Java ?

Est-ce un bug de Java ?

Patricia Arquette
Patricia Arquetteoriginal
2024-10-11 10:18:02663parcourir

Is this a bug in Java?

Récemment, j'ai voulu recréer la flexibilité de console.log en Java, j'ai donc décidé d'écrire une fonction d'impression générique qui pourrait accepter plusieurs arguments et les imprimer séparés par des virgules, tout comme console.log en JavaScript ou TypeScript. Le résultat ? Il me restait plus de questions que de réponses. Laissez-moi vous guider à travers cela.

Le code Java

J'ai commencé par écrire une simple fonction générique en Java qui prend des varargs de type T et les imprime, en séparant les valeurs par des virgules :

public class Main {
    public static void main(String[] args) {
        Main.print(1, "4", new ArrayList<>());
        // Expected type issues, but it ran without any problem!
    }

    private static <T> void print(T... args) {
        System.out.println(Arrays.toString(args));
    }
}

Je m'attendais à ce que le typage strict de Java m'avertisse ou génère une erreur lorsque je transmets des types mixtes (Integer, String et ArrayList), mais ce n'est pas le cas. Le code s'est compilé et s'est parfaitement exécuté, imprimant [1, 4, []] sans aucune plainte.

Cela m'a étonné car, en tant que personne qui travaille également avec TypeScript, cela m'a semblé bizarre. Java ne devrait-il pas détecter cette incohérence de type ?

L'essayer en TypeScript

Naturellement, je me suis tourné vers TypeScript pour voir comment il gérerait cela. J'ai écrit une fonction similaire dans TypeScript :

function print<T>(...args: T[]) {
  console.log(args.join(","));
}

print(1, "4", []);
// TS warns (which makes sense):
// Argument of type 'string' is not assignable to parameter of type 'number'.

Comme prévu, TypeScript a lancé un avertissement ! Puisque TypeScript a déduit le type T comme nombre à partir du premier argument (1), il a marqué les deuxième et troisième arguments ("4" et []) comme invalides. Ce comportement était parfaitement logique car TypeScript applique des types cohérents pour les fonctions génériques.

Alors, est-ce un bug en Java ?

Pas nécessairement. Ce qui se passe ici, c'est que le système de types de Java se comporte différemment en raison de l'effacement des types. En Java, les informations de type générique sont effacées au moment de l'exécution, ce qui signifie que lorsque vous transmettez différents types à T... args, Java n'imposera pas que tous les arguments soient du même type. Il traite simplement les entrées comme des objets.

TypeScript, en revanche, effectue des contrôles stricts à la fois à la compilation et à l'exécution, garantissant que tous les arguments correspondent au type déduit ou déclaré.

Conclusion

Cette expérience m'a laissé réfléchir : Java devrait-il appliquer des vérifications de type plus strictes comme le fait TypeScript ? Ou cette flexibilité fait-elle intentionnellement partie de la conception de Java ?

Qu'en pensez-vous ? Avez-vous rencontré des bizarreries similaires lors du basculement entre Java et TypeScript ? J’aimerais entendre vos réflexions dans les commentaires !

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn