Cette question est partiellement liée à mon dernier Question a>. J'ai une classe générique représentant une collection d'objets génériques: p> dans ma conception, ces collections d'objets sont construites par une classe cliente (appelons-le CollectionBuilder) à travers une approche de classe abstraite: p> public UserClass{
MyCollection a; //warning
MyCollection<?> b; //no warning
public method(MyObject o){ //warning
a.foo(b); //compile
}
public method2(MyObject<?> o){
b.foo(o); //error do not compile
}
}
4 Réponses :
Il y a presque toujours un moyen de paramétrer votre code. En bref, je sais que vous tapez userclass, comme ceci:
public abstract UserClass <N extends Number> { MyCollection<N> c; public method(MyObject<N> o){ c.foo(o); } public static class DoubleImpl extends UserClass<Double> {} public static class FloatImpl extends UserClass<Float> {} public static class IntegerImpl extends UserClass<Integer> {} }
Merci pour votre réponse mais OK..Je sais ça. Mais si je fais cela, même la classe, l'instanciate de mon userclass doit être conscient du type de N. Donc, de N. Donc, sera propager à presque toutes les catégories de mon projet. Mais je voudrais éviter cela parce que non de ces classes, à l'exception de la collectionBuilder, devez savoir sur le type de béton. Est-ce que je fais des erreurs conceptuelles si je veux faire ça?
@Heisenbug: Ce que je fais dans ce cas, c'est faire une implémentation générique (E.G. userclass
userClassable code>). Ensuite, le code client qui ne se soucie pas du paramétrage peut interagir avec l'interface non générique, mais tout le code est toujours fortement typé.
@Daniel Pryden: ça sonne bien. Je vais prendre en considération, merci.
Il est facile de se mettre à emporter avec des génériques. Vous devez arrêter quelque part. Donc non, je ne pense pas que ce ne soit pas paramétré une référence à un type générique est toujours une mauvaise chose. Parfois, l'effort supplémentaire nécessaire pour obtenir tous les génériques exactement juste ne vaut tout simplement pas la peine. P>
Cependant, il est préférable de spécifier des génériques dans la mesure du possible, bien sûr. Dans votre exemple, vous pouvez ajouter un paramètre générique à UserClass alors que Bohemian suggère. p>
Quant à savoir si votre collection est une mauvaise conception: les interfaces / infrastructures que vous définissez ici semble trop générale. Qu'est-ce que mycollection code> ne peut pas être fait avec simplement
java.util.list
code>? p>
Selon le compilateur Java, oui. Et Cette réponse contient beaucoup de bons points quant à pourquoi. Personnellement, je ne suis pas d'accord dans certaines situations, en particulier lorsque l'utilisation de L'idée d'avoir mais je me digresse. Selon le compilateur Java et les implémentations de types génériques, vous devez toujours paramétrer votre référence, même si vous utilisez uniquement non applicable. Bien que vous ne puissiez toujours pas déclarer aucune information de type, puis utilisez Voir la réponse de Bohemian. P> Li>
Il n'y a pas vraiment d'informations pour dire. Bien que parti du sommet de ma tête, je ne suis pas sûr de ce que le cas d'utilisation réelle serait d'avoir "une classe générique représentant une collection d'objets génériques". Pourquoi ne pas simplement utiliser les collections directement? P> LI>
ol> classe code> est concernée (comme par exemple, si vous avez une carte
mappe
> Code> à la fin de "classe" se sent comme un tidium inutile et ne rend pas le code plus lisible. p>
classe code> être paramétrée en fonction du type d'objet qu'il est associé a toujours ressenti un peu douteux en premier lieu, pour moi. Le point de
classe code> est d'avoir une interface commune pouvant être utilisée pour obtenir des informations sur n'importe quel objet (réflexion ALA), quel que soit son type. p>
> Code>. P> li>
@suppresswarnings ("non coché") code> avec une mise en forme explicite pour rendre le compilateur heureux. P> Li>
Ok..je réalisez ma question est un peu général. J'ai évité de mettre des détails parce que je voulais une réponse générale à ce sujet. Pour être plus précis, la mycollection est un réseau N-dimensionnel des cellules. MyObject sont des cellules d'un modèle d'automate cellulaire. (@Anout Engelen pourrait également être intersté dans ces détails).
<N extends Number> void foo(MyCollection<N> collection, MyObject<?> obj) { @SuppressWarnings("unchecked") MyObject<N> obj2 = (MyObject<N>)obj; collection.foo(obj2); } MyCollection<?> b; void method2(MyObject<?> o){ foo(b, o); // now works }
+1: Merci pour votre réponse aussi. Je sais que je peux supprimer l'avertissement. Je voulais savoir si faire une telle chose était considérée comme une mauvaise pratique. J'essaie d'améliorer ma compétence Java ..