2013-08-15 4 views
1

La ligne incriminée est:Comment étendre un type générique limité à un autre type générique limité?

public class InputField<W extends WidgetInterface> 
          extends InputFieldArray<W extends WidgetInterface> 

Comme vous pouvez le voir, je suis en train d'étendre un type générique (InputFieldArray) à un autre type générique (InputField). Le paramètre de type générique W est limité dans les deux cas à une implémentation de l'interface WidgetInterface. Si je fais cela, le compilateur se plaint qu'il attendait un > après le deuxième W. OK, peut-être le compilateur est assez intelligent que je peux écrire ceci:

public class InputField<W extends WidgetInterface> extends InputFieldArray<W> 

Si je fais cela, cependant, le compilateur se plaint que le deuxième W est «pas dans sa limite. Qu'est-ce que je me trompe?

+0

Je suis sûr qu'il ya de meilleures façons de faire tout ce que vous essayez de faire, sans tout ce génériques gâchis. – MightyPork

+4

Pouvez-vous nous montrer la définition de 'InputFieldArray'? –

+0

Voulez-vous le fichier de classe entière? 'InputFieldArray' est déclaré comme' public class InputFieldArray extends JPanel' –

Répondre

2

Sur la base de vos commentaires, il semble que vous devriez faire:

public class InputField<W extends Component & WidgetInterface> 
extends InputFieldArray<W> 

L'erreur du compilateur est explicite: sans donner W limites supérieures de Component et WidgetInterface, il ne relève pas de ses limites en tant que argument de type pour InputFieldArray.

Votre premier extrait est simplement une erreur de syntaxe: vous spécifiez uniquement les limites d'un paramètre de type lors de la déclaration.

4

Le compilateur a raison de se plaindre.

Vous avez dit que le paramètre générique InputFieldArray doit être une sous-classe de ComponentetWidgetInterface. Cependant, vous essayez de déclarer que InputField prend seulement un paramètre qui est un WidgetInterface.

Ceci ne peut pas être compilé, sinon quelqu'un pourrait créer un InputField avec un paramètre générique qui n'était pas un Component. Et ce n'est pas compatible avec sa superclasse - la sécurité du type serait brisée (en ce sens que les lanceurs échoueraient à l'exécution), ce qui sape tout le point des génériques.

Vous devez appliquer les mêmes contraintes (ou plus strictes) dans votre sous-classe:

public class InputField<W extends Component & WidgetInterface> 
      extends InputFieldArray<W> 
Questions connexes