2009-06-07 7 views
5

j'ai les classes suivantes mis en place:Java Generics, Generics étendues et des classes abstraites

public abstract class Process<T,S> { 
    ... 
} 

public abstract class Resource<T, S extends Process<T, S>> { 
    protected S processer; 
    ... 
} 

public class ProcessImpl<EventType1, EventType2> { 
    ... 
} 

public class ResourceImpl extends Resource<EventType1, ProcessImpl> { 
    processer = new ProcesserImpl(); 
    ... 
} 

Tout va bien jusqu'à ce que je la ResourceImpl. On me dit que ProcessImpl n'est pas un substitut valide pour le paramètre borné <S extends Process<T,S>> du type Resource<T,S>.

J'ai essayé différentes façons de contourner cela et de continuer à frapper un mur.

Quelqu'un a-t-il des idées?

Répondre

11
public class ProcessImpl<EventType1, EventType2> { 
... 
} 

Parce que ProcessImpl ne étendre processus. Votre ProcessImpl n'est pas dérivé de Process, ce que vous déclarez être ce paramètre.

0

Je ne peux pas voir un moyen d'éditer la version originale, ou commenter sur des réponses données sans un meilleur représentant.

Ce code existera sur une couche Web, eventtype2 est défini sur la couche de persistance et accessible uniquement dans la couche principale qui existe sous ce niveau.

Donc, malheureusement, sans avoir un couplage serré, que je voudrais éviter, je n'ai pas accès à EventType2.

+0

Je ne comprends pas. N'êtes-vous pas en mesure d'étendre ProcessImpl à partir de Process? –

1

Vous voudrez peut-être faire quelque chose comme ceci:

public abstract class Process<T, S> { 
} 

public abstract class Resource<T, S extends Process<T, S>> { 
    S processor; 

} 

public class ProcessImpl extends Process<EventType1, ProcessImpl> { 
} 

public class ResourceImpl extends Resource<EventType1, ProcessImpl> { 

} 

Si vous contraignez le paramètre S du Resource être un processeur, vous devez également déclarer correctement sur la classe ProcessImpl. Je ne sais pas ce que EventType2 est mais il devrait mettre en œuvre l'interface de processus. Je suppose que vous voulez vraiment dire ProcessImpl.

0

Si vous ne voulez pas que votre code dépende d'un package existant, qui contient le Process, vous pouvez également introduire un nouveau package d'interface en fonction de rien au bas de la hiérarchie de classe. (Si vous êtes capable de changer les contraintes de l'héritage bien sûr.)