Comment faire pour forcer un paramètre de type générique pour être une interface?

Est-il un moyen en java à préciser, que le paramètre de type générique d'une classe doit être une interface (pas seulement en l'étendant!)

Ce que je veux faire est la suivante:

public class MyClass<X extends SomeInterface, Y extends SomeOtherClass & X>

Sens que Y doit être une sous-classe de SomeOtherClass ET de mettre en œuvre X.
Ce que j'ai actuellement par le compilateur est

Le type de X n'est pas une interface; il ne peut pas être spécifié comme un délimitée paramètre

Alors, comment puis-je dire au compilateur que X doit toujours être une interface?

Edit:

OK, je suppose que j'ai simplifié mon problème un peu. Nous allons utiliser mon vrai domaine d'application pour la rendre plus claire:

J'ai une API pour la représentation de diagrammes. Un Diagramme contient Nœud et Bord objets. L'ensemble de ces trois classes implémentent l' Forme interface. Les formes peuvent demander à l'enfant de formes, un parent de la forme et appartiennent à un diagramme.

Le truc, c'est que j'ai besoin de faire deux versions de cette API: un open-source avec juste des fonctionnalités de base et une grande étendue avec plus de fonctionnalités. Toutefois, l'API étendue doit seulement fournir des méthodes qui renvoient l'étendue des types (ExtendedDiagram, ExtendedNode, ExtendedEdge et (ici vient le problème) ExtendedShape).

J'ai donc quelque chose comme ceci:

/* BASIC CLASSES */
public interface Shape<X extends Shape<X,Y>, Y extends Diagram<X,Y>>{
    public List<X> getChildShapes();
    public X getParent();
    public Y getDiagram();
    ...
}

public class Diagram<X extends Shape<X,Y>, Y extends Diagram<X,Y>> implements Shape<X,Y>{...}
public class Edge<X extends Shape<X,Y>, Y extends Diagram<X,Y>> implements Shape<X,Y>{...}
...

/* EXTENDED CLASSES */
public interface ExtendedShape extends Shape<ExtendedShape,ExtendedDiagram> { ... }

public class ExtendedDiagram extends Diagram<ExtendedShape,ExtenedDiagram> implements ExtendedShape { ... }
public class ExtendedEdge extends Edge<ExtendedShape,ExtenedDiagram> implements ExtendedShape { ... }
...

L'API étendue fonctionne bien et la base de code d'API donne des avertissements, mais le principal problème se produit lors de l'utilisation de l'API:

public class SomeImporter<X extends Shape<X,Y>, Y extends Diagram<X,Y>, E extends Edge<X,Y>>{
    private Y diagram;

    public void addNewEdge(E newEdge){
        diagram.addChildShape(newEdge);
    ...

Que la dernière ligne me donne l'avertissement suivant:

La méthode addChildShape(X) dans le type de Schéma n'est pas applicable pour les arguments (E)

Donc maintenant, je voudrais juste préciser que E doit également mettre en œuvre des X et que tout irait bien - je l'espère 😉

N'tous les sens? Savez-vous un moyen de le faire? Ou est-il même une meilleure façon d'obtenir l'API étendue avec lesdites restrictions?

Merci pour coller avec moi, toute aide est grandement appréciée!

  • stackoverflow.com/questions/132353/...
  • Cette erreur est un peu incorrect. Cela signifie vraiment que vous avez besoin de se référer à une véritable classe ou de l'interface et PAS un autre type générique (c'est à dire Y extends SomeOtherClass & SomeInterface, comme indiqué dans le lien fourni par @Yochai Timmer)
  • Mais que la chose: j'ai besoin d'un générique, parce que j'ai déjà un subinterface de SomeInterface (appelons cela ExtendedInterface). Maclasse est parfois utilisé avec SomeInterface et parfois avec ExtendedInterface. En outre, il peut très bien y avoir d'autres extensions de SomeIterface dans l'avenir... Peut-être, j'ai simplifié mon problème énoncé un peu trop, je vais modifier ma question initiale.
  • Pouvez-vous ajouter de la signature de la méthode pour votre addNewEdge? - note de côté: c'est Qu'une très compliquées ensembles de Génériques que vous servez, vous n'avez pas avoir le vertige?
  • Vous pouvez voir la signature de la méthode pour addNewEdge dans mon édité postes. Si vous voulez dire addChildShape puis que serait la suivante: public void addChildShape(X newShape); (dans la Forme de l'interface définie ci-dessus)
  • Et oui, il est assez complexe. Surtout en considérant le fait que je ne veux obtenir le droit de retour 😉