4 Réponses :


4
votes

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> {}
} 


3 commentaires

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 ) qui implémente une interface non générique (E.G. userClassable ). 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.



2
votes

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.

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.

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 ne peut pas être fait avec simplement java.util.list ? Existe-t-il vraiment besoin d'une interface MyObject ? Si vous souhaitez "tag" un certain type de classes, vous pouvez sûrement proposer une description plus spécifique de ce qui rend ces objets différents de tout autre objet ?


0 commentaires

6
votes
  1. 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 classe est concernée (comme par exemple, si vous avez une carte mappe ). Dans de tels cas, avoir à toucher toujours à la fin de "classe" se sent comme un tidium inutile et ne rend pas le code plus lisible.

    L'idée d'avoir classe ê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 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.

    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 .

  2. non applicable. Bien que vous ne puissiez toujours pas déclarer aucune information de type, puis utilisez @suppresswarnings ("non coché") avec une mise en forme explicite pour rendre le compilateur heureux.

  3. Voir la réponse de Bohemian.

  4. 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?


1 commentaires

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).



2
votes
<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 commentaires

+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 ..