7
votes

Le compilateur Java ignore le type de sécurité

public List<Integer> getInteger()

6 commentaires

Votre déclaration de classe n'a aucun sens: POJO --- Ceci contraint le type paramètre à un sous-type de et charcuternence , mais à partir de son nom, il semble que vous vous attendiez à ce que cela permettrait n'importe quel des deux.


@Markotopolnik Cela fonctionne si POJO est instancié sans génériques.


@assylia Comment est venu? Dans ce cas, il ignore toute information de type générique , même celles qui n'ont rien à voir avec le type de classe Param? Étrange.


@assylias l'a vérifié, émet simplement un avertissement. Ne savait pas à ce sujet. Si c'est une méthode statique, alors il émet une erreur. C'est digne d'un puzzler Java.


@Farmor J'ai considérablement édité votre question pour fournir un exemple plus simple qui montre le même comportement. N'hésitez pas à annuler si vous ne l'aimez pas.


@Markotopolnik - Ils pourraient probablement faire tout un livre de Puzzlers de Generics :-(


3 Réponses :


7
votes

comme pojo code> n'est pas déclaré comme un

Map mapOfInteger = new Map(); // no generics
Set<String> entries = map.entrySet(); // gives a warning, not an error.


4 commentaires

Nous avons donc enfin une différence définitive et claire entre pojo et pojo .


Juste un commentaire: votre ligne avec map.keySet () n'est pas aussi fort d'un exemple d'original, où la méthode renvoie une liste définie . Keyset () ne renvoie que SET , donc sans k fourni, qui m'a toujours fait du sens. Celui-ci est plus un head-scratchers.


@Markotopolnik Entrée () est un meilleur exemple.


@Peterlawrey J'aime bien et clair, donc j'ai trouvé la référence JLS qui sauvegarde vos réclamations ;-)



2
votes

Il s'agit d'une affectation non cochée qui n'est pas traitée comme une erreur pour des raisons de compatibilité.

voir Interopérant avec le code hérité

En réalité, la mission est légale, mais elle génère un avertissement non contrôlé.


0 commentaires