37 votes

Quelle est la différence entre le joker borné et les paramètres de type ?

Y a-t-il une différence entre

 Collection getThatCollection(Class type)

et

Collection getThatCollection(Class)

36voto

notnoop Points 30218

Ils exposent différentes interfaces et contrats pour la méthode.

La première déclaration devrait renvoyer une collection dont le type d'éléments est le même que celui de la classe d'argument. Le compilateur déduit le type de N (si non spécifié). Ainsi, les deux déclarations suivantes sont valides lors de l'utilisation de la première déclaration :

Collection c1 = getThatCollection(Integer.class);
Collection c2 = getThatCollection(Double.class);

La deuxième déclaration ne déclare pas la relation entre l'argument de type de Collection retourné et la classe d'argument. Le compilateur suppose qu'ils sont sans rapport, donc le client devrait utiliser le type retourné comme Collection, indépendamment de l'argument :

// Déclarations invalides
Collection c1 = getThatCollection(Integer.class);   // invalide
Collection c2 = getThatCollection(Double.class);   // invalide
Collection cN = getThatCollection(Number.class);   // invalide

// Déclarations valides
Collection c3 = getThatCollection(Integer.class);  // valide
Collection c4 = getThatCollection(Double.class);  // valide
Collection cNC = getThatCollection(Number.class);  // valide

Recommandation

S'il existe effectivement une relation entre le type de retour et l'argument passé, il est bien préférable d'utiliser la première déclaration. Le code client est plus propre comme indiqué ci-dessus.

Si la relation n'existe pas, il est toujours préférable d'éviter la deuxième déclaration. Avoir un type retourné avec un joker borné force le client à utiliser des jokers partout, rendant ainsi le code client encombré et illisible. Joshua Bloch souligne que vous devriez Éviter les Jokers Bornés dans les Types de Retour (diapositive 23). Bien que les jokers bornés dans les types de retour puissent être utiles dans certains cas, la laideur du code résultant devrait, à mon avis, l'emporter sur le bénéfice.

-3voto

Monachus Points 115

Dans ce cas particulier, non. cependant, la deuxième option est plus flexible car elle vous permettrait de renvoyer une collection qui contient des éléments d'un type différent (même si ce serait également un nombre) que le type contenu par le paramètre de la collection.

Exemple concret:

Collection getRoot(Class number){ 
    ArrayList result=new ArrayList();
    result.add(java.util.Math.round(number); 
    return result) 
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X