Я полагаю, вы ищете метод, который берет список, добавляет что-то к нему, а затем возвращает список.Список является общим, и вы хотите, чтобы тип возвращаемого значения соответствовал типу параметра.
Вот как вы это делаете, в общем случае:
public <T extends Parent> List<T> myfunction(List<T> myList) {
... // Add something to myList
return myList;
}
В частности, вы пытаетесьдобавить new Child()
к myList
.Это не может работать.myfunction()
может вызываться со многими видами списков, тогда как добавление new Child()
может работать, только если список является List<Parent>
или List<Child>
.Вот пример для списка другого типа:
public static class Parent {}
public static class Child extends Parent {}
public static class OtherChild extends Parent {}
public <T extends Parent> List<T> myfunction(List<T> myList) {
myList.add(new Child());
return myList;
}
myfunction(new ArrayList<OtherChild>());
В последней строке myfunction()
вызывается со списком объектов OtherChild
.Очевидно, что добавление объекта Child
в такой список недопустимо.Компилятор предотвращает это, отклоняя определение myfunction()
Приложение
Если вы хотите, чтобы myfunction()
мог добавить элемент в myList
, вам нужноиспользовать фабрику (поскольку Java не позволяет new T()
, где T - параметр типа - из-за стирание типа ).Вот как должен выглядеть myfunction()
:
public interface Factory<T> {
public T create();
}
public <T extends Parent> List<T> myfunction(List<T> myList,
Factory<? extends T> factory) {
myList.add(factory.create());
return myList;
}
А теперь его использование:
public static class ChildOfOtherChild extends OtherChild {}
myfunction(new ArrayList<OtherChild>(), new Factory<ChildOfOtherChild>() {
@Override public ChildOfOtherChild create() { return new ChildOfOtherChild(); }
});
}