2010-04-21 15 views
12

Je suis en train de mettre à jour du code vers Java 5 et je ne comprends vraiment pas quelque chose avec Generics. J'ai d'autres classes qui implémentent une fois comparable, que j'ai pu mettre en place. Mais maintenant j'ai une classe qui, en raison de l'héritage, finit par essayer d'implémenter Comparable pour 2 types. Voici ma situation:Comment puis-je implémenter Comparable plus d'une fois?

J'ai les classes/interfaces suivantes:

interface Foo extends Comparable<Foo> 

interface Bar extends Comparable<Bar> 

abstract class BarDescription implements Bar 

class FooBar extends BarDescription implements Foo 

Avec cela, je reçois l'erreur 'interface Comparable ne peut pas être mis en œuvre plus d'une fois avec des arguments différents ...'

Pourquoi ne puis-je pas avoir un compareTo (Foo foo) implémenté dans FooBar, et aussi un compareTo (Bar) implémenté dans BarDescription? N'est-ce pas simplement une méthode surchargée?

Modifier: J'ai de nombreuses classes qui étendent BarDescription. Si je supprime le paramètre type pour Comparable sur Bar, le laissant à l'état brut, alors je reçois un tas d'avertissements du compilateur lors du tri de toutes les classes qui étendent BarDescription. Serait-ce résolu avec les réponses wildcards ci-dessous? Cette réponse semble assez compliquée et difficile à comprendre pour la maintenance.

+0

Même question, cas différent. Vous cherchez quelque chose appelé effacement de type. – falstro

+0

@row Quelque chose appelé wildcards. –

+3

@ codeman73: mais vous ne pouvez tout simplement pas le faire en Java ... Java ne supporte pas le vrai polymorphisme paramétrique. C'est pourquoi lorsque vous vous concentrez sur "OO" au lieu de "Java idiosynchrasies" les génériques Java sont pour la plupart inutiles: bien sûr, ils sont bien pour les "collections" et pour le programme procédural (et donc bien la mentalité de 99% des Développeurs Java là-bas) mais ce n'est tout simplement pas OO du tout. C'est mon plus gros reproche avec les génériques en Java: vous ne pouvez pas avoir à la fois * Handeable * et * Handizable * et cela rend les génériques ** inutiles ** du point de vue OO. – SyntaxT3rr0r

Répondre

14

Les génériques n'existent pas après la compilation du bytecode. Restrictions à partir de ceci: Vous ne pouvez pas implémenter/étendre deux ou plusieurs interfaces/classes qui seraient identiques sans le paramètre générique et qui sont différentes avec le paramètre générique.

Qu'est-ce que vous pourriez faire si vous voulez vraiment vraiment la sécurité de type est:

interface Foo<T extends Foo<?>> extends Comparable<T> 
interface Bar<T extends Bar<?>> extends Comparable<T> 
abstract class BarDescription<T extends Bar<?>> implements Bar<T> 
class FooBar extends BarDescription<FooBar> implements Foo<FooBar> 
+0

Cela fonctionne en quelque sorte. J'essaie toujours d'envelopper ma tête autour d'elle. Pourquoi avons-nous besoin de la Je voudrais avoir fait mon post original avec des exemples plus concrets. – user26270

+0

Aussi, n'est-il pas redondant d'avoir l'interface Foo >? Une autre question est que j'ai beaucoup de classes qui se prolongent BarDescription mais pas Foo, et maintenant tous ceux-ci doivent définir le type pour BarDescription et mettre en œuvre compareTo (AnotherBarDescription), tels que: la classe AnotherBarDescription étend BarDescription user26270

+0

Oui il est redondant. mais Java Generics a des problèmes. Un gros problème est l'héritage (le type super est? À la place de l'objet). Par exemple, Foo foo = new Foo () n'est pas autorisé. – mkorpela

8

J'écrirait quelques Comparator s et être fait avec elle.

1

Avoir plusieurs implémentations d'interfaces génériques rencontrerait des problèmes lorsque vous considérez des caractères génériques.

Cela ne dépend pas de l'effacement.