J'essaie vraiment d'aimer les génériques, mais il y a jusqu'à présent, les ennuis qu'ils ont provoqués les avantages. S'il vous plaît, montre-moi s'il vous plaît me montrer mal.
Je comprends la nécessité d'ajouter @suppresswarnings ("non cochée") lors de l'utilisation de cadres sans générique (printemps, hibernate). Cela seul réduit vraiment la valeur des génériques, comme cela exige que les classes soient passées dans le constructeur pour éviter les pièges d'effacement. Cependant, la vraie épine semble toujours être coulée. J'essaie habituellement un moment d'obtenir la syntaxe à droite, mais abandonnez ma tentative de pureté, ajoutez une @suppresswarnings et passez avec ma vie. P>
Voici un exemple: je réfléchis à un exemple haricot à rechercher des différences entre deux cas. Certaines propriétés mettent en œuvre de manière comparable de telle sorte Dans ces cas, je veux que la propriété soit considérée comme la même. P> aucune idée sur ce que je pouvais mettre dans (aide)? P> p> P>
4 Réponses :
Ceci me regarde comme en allant à ce sujet la dure. Vous pouvez soit que vos haricots soient implémenter comparables, auquel cas vous les comparez simplement directement, ou vous créez un comparateur -
public int compare(Bean a, Bean b){
Comparator<Bean> c = new Comparator<Bean>(){
public int compareTo(Bean a, Bean b){ ... }
public boolean equals(Object o){.. }
};
return c.compare(a, b);
}
Merci pour ton aide! Je suis désolé mais j'ai trop simplifié mon exemple original au point où les comparateurs spécifiques à la classe fonctionnaient. J'ai maintenant mis à jour l'exemple pour refléter avec plus de précision mes besoins pour recueillir des enregistrements Delta par propriété qui a changé. Vous pouvez également imaginer que j'aurais besoin de scanner un très grand graphique d'objet pour générer de nombreux enregistrements de Delta.
Je ne vois pas tout à fait ce qui ne va pas avec simplement en faisant simplement ce qui suit: à l'aide de clas.Cast code> dans votre cas n'a pas vraiment l'aide du tout avec sécurité de type. p> p>
J'essaie d'éviter de faire exactement cela, car il jette un avertissement: "Comparable est un type brut. Les références au type générique comparable
Étant donné que le générique est effaré au runtime, Generic ne vous aide pas du tout. Je viens de modifier le code pour rendre le code plus "générique". Il est plus important de rendre le code lisible que de satisfaire le compilateur lorsqu'il ne vous donne aucune sécurité supplémentaire.
N'est-ce pas possible - à l'exécution - Introspectivement le paramètre Type (c'est-à-dire le "X" en comparable
On dirait que l'hypothèse est que si une classe implémente Cependant, il est définitivement possible de définir une classe comme " ... mais clairement, un donc, l'avertissement est valide. Le code, utilisant des types bruts, n'est pas un type de type et pourrait soulever des exceptions au moment de l'exécution. P> P> comparable code>, le paramètre Type est la classe elle-même. C'est-à-dire que " classe x implémente comparable Classe x implémente comparable classcastxception code> serait soulevé car B code> n'est pas une instance de y code>. p>
Le problème ici est que vous ne connaissez pas les types de propriétés de haricot avant l'exécution du temps d'exécution. Vous ne pouvez pas savoir quel argument de type comparable code> de n'importe quelle manière commode.
@erickson Je suis complètement d'accord avec votre analyse. Cependant, ne devrait-il pas y avoir un moyen d'atteindre le casting correct - au moment de l'exécution - afin que je puisse vérifier si deux objets sont comparables les uns contre les autres, puis effectuez cette comparaison? Compte tenu de toutes les méthodes d'exécution qui sont à la disposition de nous, il semble que vous puissiez pouvoir faire cela ...
Eh bien, étant donné que je n'ai pas pu trouver de manière "pure" de le faire, et le fait que je continuais à courir dans des cas d'angle (comme, en plus de celui-ci, la difficulté de manipuler des propriétés qui sont des collections) , J'ai décidé de faire ma méthode de génération de delta way em> dumber. J'ai réalisé que je ne teste que 9 types d'objets différents, je ne peux donc que tester les 9 objets que je comparais, puis jetez sur cet objet et effectuez des tests spécifiques à l'objet. P>
La mise en œuvre de cette manière a pris environ une heure, et même si je dois rééquilibrer chaque fois que tous les objets changent, je pense que je suis toujours au noir même si je passe des journées sur cette maintenance. P >
Donc, à la fin, je suppose que la réponse est qu'il n'y a pas de réponse. Les génériques Java sont implémentées de manière à ce qu'il soit impossible d'éviter de supprimer occasionnellement des avertissements du compilateur et de risquer des exceptions de classes de temps d'exécution. P>
Le problème avec
horodatage code> etdate code> est un problème bien connu: bugs.sun.com/bugdatabase/view_bug.do?bug_id=4631234 . Il a été fixé dans Java 6 (probablement en 5U6 aussi).Les variables "originales" et "mises à jour" sont-elles censées être "poriginales" et "chukdated", respectivement?
Je suis heureux que l'horodatage / la confusion date a été corrigée. J'ai bien peur que ça ne m'aidait pas comme je suis coincé sur 1,5, mais c'est bon de savoir pour l'avenir.
@erickson merci d'avoir souligné les typos ... Corrigé!