2013-06-26 5 views
0

Мне нужно реализовать метод как общий. Как это сделать ?Как реализовать общий метод

public SelectItem[] criarFiltroSexo(Sexo[] tp){ 
SelectItem[] options = new SelectItem[tp.length]; 
     for(int i = 0; i < tp.length; i++) { 
      options[i] = new SelectItem(tp[i].getId(),tp[i].getDescricao()); 
     } 
     return options; 
} 

Я должен реализовать несколько методов, как это и мне нужно повторить для каждого отдельного entity.So у меня есть много методов criarFiltroxxx

Я хотел бы реализовать что-то вроде этого:

public <E> criarFiltrogenerico(E[] tp){ 
     SelectItem[] options = new SelectItem[tp.length]; 
     for(int i = 0; i < tp.length; i++) { 
      options[i] = new SelectItem(tp[i].getId(),tp[i].getDescricao()); 
     } 
     return options; 
    } 

Но я получил сообщение об ошибке: тип возвращаемого значения метода отсутствует .....

+6

ли эта помощь? http://docs.oracle.com/javase/tutorial/extra/generics/methods.html –

+0

вы можете уточнить? – sanbhat

+0

Теперь ваш код отлично виден. Где вы хотите использовать дженерики? –

ответ

2

Но я получил сообщение об ошибке: тип возвращаемого значения метода отсутствует .....

В линия:

public <E> criarFiltrogenerico(E[] tp) { 

Что у вас есть public ключевого слова, <E> типа переменного и criarFiltrogenerico(E[] tp) имени методы и параметры ,

Естественно, вам не хватает типа возврата.Добавьте его:

public <E> RETURN-TYPE-HERE criarFiltrogenerico(E[] tp) { 

Так что это будет работать:

public <E> SelectItem[] criarFiltrogenerico(E[] tp) { 
     SelectItem[] options = new SelectItem[tp.length]; 
     for(int i = 0; i < tp.length; i++) { 
      options[i] = new SelectItem(tp[i].getId(),tp[i].getDescricao()); 
     } 
     return options; 
} 

Проблема заключается в том, что тип E должен иметь getId() и getDescricao() методы. Если у вас есть родительский класс/интерфейс с этими методами, скажем ParentItem (где Sexo extends ParentItem или Sexo implements ParentItem), вы должны использовать:

public <E extends ParentItem> SelectItem[] criarFiltrogenerico(E[] tp) { 
+0

У меня ошибка: метод getDescricao() не определен для типа E. Метод getId не определен для типа E. – Al2x

+0

Да, я просто добавил это наблюдение. Проверьте последнюю часть: * «Предостережение - это тип' E' ... »*. – acdcjunior

+0

Этот метод был реализован в моем бобах по имени Пессоа. Я не могу расширить ParentItem, потому что мне нужно вызвать этот метод, передавая в качестве параметра другой объект, такой как Sexo и т. Д. – Al2x

0

Вообще говоря, re - это два способа решения этой проблемы без необходимости переписывать код для каждого типа:

  1. Вы используете Generics. Это означало бы наличие всего объекта, который включает в себя вашу функцию criarFiltroSexo(...) и создание одного объекта для каждого класса, с которым вы хотите его использовать. Если criarFiltroSexo находится в классе под названием DoStuff и Sexo расширяет ParentClass (как и все другие классы, которые вы хотите использовать эту функцию с), например, вы можете реализовать это следующим образом:

    public class DoStuff<T extends ParentClass> { 
        //... 
        public SelectItem[] criarFiltroSexo(T[] tp){ 
         SelectItem[] options = new SelectItem[tp.length]; 
         for(int i = 0; i < tp.length; i++) { 
          options[i] = new SelectItem(tp[i].getId(),tp[i].getDescricao()); 
         } 
         return options; 
        } 
        //... 
    } 
    
  2. Использовать наследование вместо этого. Тогда ваша функция будет выглядеть следующим образом:

    public SelectItem[] criarFiltroSexo(ParentClass[] tp){ 
        SelectItem[] options = new SelectItem[tp.length]; 
        for(int i = 0; i < tp.length; i++) { 
         options[i] = new SelectItem(tp[i].getId(),tp[i].getDescricao()); 
        } 
        return options; 
    } 
    

    Теперь вы можете позвонить, что с массивами всего, что простирается ParentClass, например, Sexo[] sexos = new Sexo[10].

+0

спасибо @blalassadri – Al2x

0

Создайте интерфейс, который имеет методы, которые нужно использовать:

interface HasIdAndDescricao { 
    int getId(); 
    String getDescricao(); 
} 

Добавим, что интерфейс для классов, которые вы хотите использовать с помощью метода:

class Sexo implements HasIdAndDescricao { 
    // no change required 
} 

Bound родовое к интерфейсу:

public <T extends HasId> SelectItem[] criarFiltrogenerico(T[] tp){ 
    SelectItem[] options = new SelectItem[tp.length]; 
    for(int i = 0; i < tp.length; i++) { 
     options[i] = new SelectItem(tp[i].getId(), tp[i].getDescricao()); 
    } 
    return options; 
} 

Вы можете использовать параметр вместо списков параметров, не меняя тела метода:

public <T extends HasId> SelectItem[] criarFiltrogenerico(T... tp){ 
    // same body 
} 
Смежные вопросы