2010-11-12 4 views
4

У меня есть простой метод, который принимает общий параметр List, но по какой-то причине моя IDE (Eclipse) заявляет, как это невозможно решить?Параметр параметра Generic Java невозможен?

я делаю что-то здесь

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

     return new OnClickListener() { 

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

      } 
     }; 
    } 
+0

Я просто добавлю к ответу Ридуйда, что в этом случае общий параметр не нужен, если только OnClickListener не намерен использовать T. Ie, private OnClickListener removeFieldListener ... – Yoni

ответ

11

В этом случае параметр T должен быть определен где-то. Как я предполагаю, что ваш класс не объявляет этот параметр, вы должны поместить его в объявлении метода, как

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

Но это будет двигаться только проблема вызвавшей этого метода ...

+0

На самом деле это не должно переместить проблему вызывающим абонентам. Java будет использовать вывод типа для определения того, что 'T' основан на типе передаваемого списка. не должно быть дополнительной нагрузкой на вызывающих абонентов, по сравнению с использованием подстановочного или необработанного типа. –

+0

ahh ok, как бы определить этот общий T в классе? я знаю, что мог бы сделать что-то вроде общедоступного класса привет , но если я это сделаю, вызывающему из этого всего класса нужно будет указать этот общий тип, который я не хочу делать, поскольку метод выше является частным методом и имеет дело с частными переменными, которые рассматриваются в этом классе, а не вызывающем его классе. Я предполагаю, что могу сделать что-то по объявлению этого класса с чем-то вроде частного Generic T; ? – jonney

+1

@jonney - см. Пример Riduidel, '' это вторая часть подписи. Это означает, что * метод * параметрируется без необходимости добавления в класс общего параметра. См. Раздел «Общие методы» часто задаваемых вопросов) (http://www.angelikalanger.com/GenericsFAQ/FAQSections/ParameterizedMethods.html#Fundamentals). –

9

Riduidel правильно, что проблема заключается в том, что вы не объявили T в любом месте.

В зависимости от того, что вы хотите сделать с содержимым списка, скорее всего, вы можете просто использовать шаблон. List<?> viewList будет работать, если вы вытаскиваете только Object s; или List<? extends IListener> позволит вам избавиться от него и т. д.

В общем, вам не нужен общий параметр, если он появляется только один раз внутри вашего метода, и вместо этого вы должны использовать подстановочный знак. Если оно делает, то оно появляется несколько раз, например, вы удаляете вещи из списка и назначаете их переменным типа T, тогда вам действительно нужен шаблон, и вы должны параметризовать свой метод as Riduidel suggests.