2015-04-24 2 views
1

Как я могу пропустить объект, который простирается от класса? я приведу пример: У меня есть абстрактный класс (AbstractDTO) и 2 класса, который проходит AbstractDTO:Java Generics extends Loop

public abstract class AbstractDTO 
{ 
    private int id; 

    /** 
    * @return the id 
    */ 
    public int getId() 
    { 
     return id; 
    } 
    /** 
    * @param id the id to set 
    */ 
    public void setId(int id) 
    { 
     this.id = id; 
    } 
} 


public class FirstDTO extends AbstractDTO 
{ 

} 

public class SecondDTO extends AbstractDTO 
{ 

} 

Теперь я получил метод, который excpects 2 Коллекции объектов, которые распространяются AbstractDTO. Я хочу добавить все объекты второго списка в первый список, если они уже не в первом списке. как я могу это сделать?

я попытался следующие:

public static void summarizeCollection(List<? extends AbstractDTO> firstList, Set<? extends AbstractDTO> secondList) 
    { 
     for(AbstractDTO second : secondList) 
     { 
      boolean exists = false; 
      for (AbstractDTO first : firstList) 
      { 
       if (second.getId() == first.getId()) 
       { 
        exists = true; 
       } 
      } 
      if(!exists) 
      { 
       firstList.add(second); 
      } 
     } 

    } 

Я получил сообщение об ошибке в строке "firstList.add (второй);" потому что мой второй объект имеет тип AbstractDTO, а не класс, который расширяет AbstractDTO.

Может ли кто-нибудь помочь мне в этом? Thx много;)

ответ

3

Компилятор не может быть уверен, что элементы в secondList одного и того же типа элементов, объявленных в firstList, таким образом, вы получите ошибку компилятора здесь:

firstList.add(second); 

Это вызвано для определение аргументов:

List<? extends AbstractDTO> firstList, Set<? extends AbstractDTO> secondList 

Если вы уверены, что обе List и Set одного и того же типа, и этот тип расширяет AbstractDTO, затем объявить м еню как это:

public static <T extends AbstractDTO> void summarizeCollection(List<T> firstList, Set<T> secondList) 

Затем, внутри метода, изменить этот цикл for:

for(AbstractDTO second : secondList) 

в

for(T second : secondList) 

А.

Подробнее:

3

ошибка компилятор есть, потому что компилятор не может гарантировать, что подстановочные от List равно шаблона из Set.

Вы можете решить эту проблему, выполнив общий метод. Вам нужна переменная типа, представляющая тип List, который должен быть AbstractDTO, скажем T. Вы можете сделать Set подстановочный знак, ограниченный T, так что Set любого типа T или продолжит T может добавить свои элементы в List.

public static <T extends AbstractDTO> void summarizeCollection(
    List<T> firstList, Set<? extends T> secondList) 

Тогда переменные обоих for Loops' должны быть типа T.

for(T second : secondList) 

и

for (T first : firstList) 

Это позволит вызов add для компиляции.

Смежные вопросы