2010-11-12 6 views
4

J'ai une méthode simple qui prend un paramètre générique de liste mais pour une raison quelconque mon IDE (Eclipse) indique comment il ne peut pas être résolu?Java générique Paramètre de liste impossible?

que je fais quelque chose de mal ici

private OnClickListener removeFieldListener(final LinearLayout layout, 
      List<T> viewList) { 

     return new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       int indexToDelete = layout.indexOfChild(v); 

      } 
     }; 
    } 
+0

Je vais juste ajouter à la réponse de Riduidel, qu'il semble que le paramètre générique n'est pas nécessaire dans ce cas, à moins que l'OnClickListener ne soit également utilisé pour utiliser T. Par exemple, privé OnClickListener removeFieldListener ... – Yoni

Répondre

11

Dans ce cas, le paramètre T doit être défini quelque part. Comme je suppose que votre classe ne déclare pas ce paramètre, vous devez mettre dans votre déclaration de méthode, comme

private <T> OnClickListener removeFieldListener(final LinearLayout layout, 
     List<T> viewList) { 

Mais cela ne se déplacera le problème à l'appelant de cette méthode ...

+0

En fait, cela ne devrait pas déplacer le problème aux appelants - Java utilisera l'inférence de type pour déterminer quel 'T' est basé sur le type de la liste qui est passée. ne devrait pas être un fardeau supplémentaire sur les appelants, par rapport à l'utilisation d'un caractère générique ou le type brut. –

+0

ahh ok, comment pourrais-je définir ce T générique dans la classe? Je sais que je pourrais faire quelque chose comme bonjour public mais si je fais cela, l'appelant de toute cette classe aurait besoin de spécifier ce type générique que je ne veux pas faire comme la méthode ci-dessus est une méthode privée et traite des variables privées sont traitées à l'intérieur de cette classe, pas l'appelant de cette classe. Je devine que je peux faire quelque chose le long de la déclaration de cette classe avec quelque chose comme T générique privé; ? – jonney

+1

@jonney - voir dans l'exemple de Riduidel, le '' qui est la deuxième partie de la signature. Cela signifie que la * méthode * est paramétrée sans que vous ayez besoin d'ajouter un paramètre générique à la classe. Voir la section [Méthodes génériques de la FAQ sur les génériques] (http://www.angelikalanger.com/GenericsFAQ/FAQSections/ParameterizedMethods.html#Fundamentals). –

9

Riduidel est vrai que le problème est que vous n'avez pas déclaré le T n'importe où. En fonction de ce que vous voulez faire avec le contenu de la liste, il est probable que vous pouvez simplement utiliser un caractère générique. List<?> viewList fonctionnerait si vous n'en tirez que Object s; ou List<? extends IListener> vous permettra de sortir IListeners, etc.

En général, vous n'avez pas besoin d'un paramètre générique s'il n'apparaît qu'une fois dans votre méthode, et vous devez utiliser un caractère générique à la place. Si apparaît plusieurs fois, par exemple si vous supprimez des éléments de la liste et que vous les affectez à des variables de type T, vous avez en effet besoin du caractère générique et vous devez paramétrer votre méthode as Riduidel suggests.