Le problème avec
List<String> list = new LinkedList();
c'est que sur le côté gauche, vous utilisez le générique de type List<String>
où sur le côté droit, vous êtes à l'aide de la crue de type LinkedList
. Raw types en Java efficacement n'existent que pour la compatibilité avec les pré-génériques de code et ne doit jamais être utilisé dans le nouveau code, à moins que
vous devez absolument.
Maintenant, si Java a les génériques de début et n'ont pas de types, tels que l' LinkedList
, qui ont été initialement créés avant il avait des génériques, il aurait sans doute pu faire en sorte que le constructeur d'un type générique déduit automatiquement ses paramètres de type de la gauche de la cession, si possible. Mais il n'a pas, et il doit traiter les raw des types et des types génériques différemment pour assurer la compatibilité ascendante. Qui se laisse avoir besoin de faire un légèrement différent, mais tout aussi pratique, la façon de déclarer une nouvelle instance d'un objet générique, sans avoir à répéter ses paramètres de type... le diamant de l'opérateur.
En ce qui concerne votre exemple original d' List<String> list = new LinkedList()
, le compilateur génère un avertissement pour cette mission parce qu'il doit. Réfléchissez à ceci:
List<String> strings = ... // some list that contains some strings
// Totally legal since you used the raw type and lost all type checking!
List<Integer> integers = new LinkedList(strings);
Les génériques existent pour fournir au moment de la compilation de protection contre de faire la mauvaise chose. Dans l'exemple ci-dessus, à l'aide de la crue de type signifie que vous n'obtenez pas de cette protection et obtenez une erreur lors de l'exécution. C'est pourquoi vous ne devriez pas utiliser des types.
// Not legal since the right side is actually generic!
List<Integer> integers = new LinkedList<>(strings);
Le diamant de l'opérateur, cependant, permet à la droite de l'affectation doit être défini comme un vrai générique instance avec le même type de paramètres que le côté gauche... sans avoir à saisir ces paramètres. Il vous permet de garder la sécurité des génériques avec presque le même effort que l'utilisation de la crue de type.
Je pense que l'essentiel à comprendre est que le raw (avec n <>
) ne peuvent pas être traités de la même manière que les types génériques. Lorsque vous déclarez une crue de type, vous obtenez tous les avantages et la vérification de type de médicaments génériques. Vous devez également garder à l'esprit que les génériques sont d'un usage général, la partie du langage Java... ils ne s'appliquent pas uniquement à la non-arg constructeurs d' Collection
s!