7
votes

Jeter à un comparable, puis comparable

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.

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

aucune idée sur ce que je pouvais mettre dans (aide)?


4 commentaires

Le problème avec horodatage et date 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é!


4 Réponses :


4
votes

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);
}


1 commentaires

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.



2
votes

Je ne vois pas tout à fait ce qui ne va pas avec simplement en faisant simplement ce qui suit: xxx

à l'aide de clas.Cast dans votre cas n'a pas vraiment l'aide du tout avec sécurité de type.


3 commentaires

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 doivent être paramétrées". Maintenant, je pouvais simplement mettre un @suppresswarnings au sommet de ma méthode pour que cela disparaisse, mais j'espérais une réponse "pure". Cette solution évite entièrement les génériques. Vous êtes absolument juste à propos de l'utilisation Cast (), cependant. C'est exactement aussi fragile que le casting dans votre solution. La seule raison pour laquelle il est là est parce que j'essayais de faire de la réflexion / manipulation de type à court terme.


É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 )? Je pensais que tu pouvais faire quelque chose comme: comparable.getclass (). GettyPeparamètres () [0] .gegenericdecla ration (). Joli? Définitivement pas. Étant donné que tout le code de cette méthode a été écrit en Java1.5, je pensais qu'il serait possible d'écrire quelque chose qui ne jette aucun avertissement / erreurs et est sûr, sans avoir à supprimer quoi que ce soit. Est-ce un rêve de tuyau?



1
votes

On dirait que l'hypothèse est que si une classe implémente comparable , le paramètre Type est la classe elle-même. C'est-à-dire que " classe x implémente comparable ". Si tel est le cas, il est logique de dire que xxx

Cependant, il est définitivement possible de définir une classe comme " Classe x implémente comparable " . Ensuite, on pourrait tenter quelque chose comme ça ... xxx

... mais clairement, un classcastxception serait soulevé car B n'est pas une instance de y .

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.


2 commentaires

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



0
votes

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

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.

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.


0 commentaires