Ошибка несоответствия типов: невозможно преобразовать ArrayList <SubClass1> в список <SuperClass> - PullRequest
6 голосов
/ 04 апреля 2011

Вот моя структура класса, и где я получаю ошибку

class SuperClass{
//variables
}

class SubClass1 extends SuperClass{
//variables
}

class SubClass2 extends SuperClass{
//variables
}

class AClass{
List<SuperClass> list;

public AClass(boolean b){
if(b)
list = new ArrayList<SubClass1>();//getting error here
else
list = new ArrayList<SubClass2>();//and here
}
void addObjects(SuperClass obj){
list.add(obj);
}

}

Как я могу решить это? Должен ли я изменить свой дизайн? Как?

Сложение:

Когда я изменился

`List<SuperClass> list;`

в List<? extends SuperClass> list;

Я не получаю предыдущую ошибку, но получаю другую ошибку при добавлении объектов,

The method add(capture#2-of ? extends SuperClass) in the type List<capture#2-of ? extends SuperClass> is not applicable for the arguments (SuperClass)

Ответы [ 2 ]

4 голосов
/ 04 апреля 2011

Кажется, вы пытаетесь создать список, который содержит только объекты из определенного подкласса. В этом случае вам просто нужны дженерики, чтобы хорошо играть во время компиляции. (Дженерики стираются во время выполнения :))

class AClass<T extends SuperClass> {
    List<T> list;

    public AClass(){
        list = new ArrayList<T>();
    }

    void addObjects(T obj){
        list.add(obj);
    }

}
4 голосов
/ 04 апреля 2011

Вы должны использовать ограниченный шаблон в объявлении ArrayList:

 class AClass{

      List<? extends SuperClass> list;

      public AClass(boolean b){
         if(b)
          list = new ArrayList<SubClass1>();
        else
          list = new ArrayList<SubClass2>();
        }
      }
}

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

Для получения дополнительной информации о подстановочных знаках см. здесь .

По поводу вашей другой проблемы:

Тип параметра для list.add ():? простирается

Суперкласс - неизвестный подтип Суперкласса. Так как мы не знаем, что это за тип, мы не знаем, является ли это супертипом. это может или не может быть такой супертип, так что это не безопасно передать туда SubClass1 или SubClass2.

...