Как привести Список <T>, чтобы можно было вызывать определенный метод для соответствующего Объекта? - PullRequest
2 голосов
/ 08 августа 2011

У меня есть кое-что о родовом приведении для List, но, честно говоря, я не знаю, возможно ли это реализовать.

В моем приложении есть этот фрагмент кода

public String getObjectACombo() {
   List<ObjectA> listA = theDAO.getObjectA();
   String combo = getCombo(listA, "rootA"); // --> This line
}

public String getObjectBCombo() {
   List<ObjectB> listB = theDAO.getObjectB();
   String combo = getCombo(listA, "rootA"); // --> This line
}

Сначала я кодировал некоторую подпрограмму для строк, упомянутых как "-> Эта строка".Но оба метода имеют одинаковый алгоритм генерации строки JSON из списка.который был возвращен из базы данных.Поэтому я подумываю заменить их универсальным методом getCombo (List list, String root).Но дело в том, что мне не удалось заставить его работать.

public <T> String getCombo(List<T> list, String root) {
   Iterator<T> listItr = list.iterator();

   ...
   while ( listItr.hasNext() ) {
      jsonObj.put(list.get(i).toJson());  // --> The Error line
   }
}

Произошла ошибка «строки ошибки».И ObjectA.java, и ObjectB.java содержат метод toJson (), но «метод toJson () не определен для типа T» в указанной строке.

Я пытался привести его к (T) и Class.forName (), но ни один из них не сработал.

Есть ли способ обойти эту проблему?Это вообще возможно?

Ответы [ 2 ]

6 голосов
/ 08 августа 2011

Используйте интерфейс, который определяет метод toJson(), например, Jsonable :) - и затем ограничьте T:

public <T extends Jsonable> String getCombo(List<T> list, String root) { 
 ...
}

Таким образом, компилятор знает, что каждый T должен наследовать отJsonable и, следовательно, имеет метод toJson().

Редактировать: вот пример того, что я имею в виду, используя уже существующий интерфейс Comparable<T>:

public <T extends Comparable<T>> boolean compare(List<T> list, T other) {
  for( T object : list ) {
    if( object.compareTo( other ) == 0 ) {
      return true;
    }
  }    
  return false;
}

compare( new ArrayList<String>(), "foo"); //compiles, since String implements Comparable<String>
compare( new ArrayList<Object>(), null); //doesn't compile, since Object doesn't implement Comparable<Object>
0 голосов
/ 08 августа 2011

Попробуйте использовать для каждого:

public <T> String getCombo( List<T> list, String root )
{
    for (T x : list)
    {
        //do stuff here
    }
}
...