У меня проблемы с эффективным использованием дженериков.Большую часть времени, когда я сталкиваюсь с проблемой, описанной ниже, я в конечном итоге нахожу другой способ выполнить то, что мне нужно, но у меня возникает ощущение, что мне не хватает понимания относительно использования обобщений в Java.
ЕслиЯ хотел создать метод, который бы возвращал List, где T расширяет все, что я получаю, ошибка компилятора, говорящая, что все, что я добавляю в список, не может быть преобразовано в T.
Пожалуйста, посмотрите код ниже, например (s):
public interface I1 {
}
public interface I2 {
}
public class ValidType implements I1, I2 {
}
public class OtherValidType extends ValidType {
}
public class Foo {
private static <T extends I1 & I2> List<T> getList() {
List<T> list = new ArrayList<>();
list.add(new ValidType());
list.add(new OtherValidType());
return list;
}
}
Компилятор даже не позволит мне сделать что-то более простое, например:
public class Foo {
private static <T extends ValidType> List<T> getList() {
List<T> list = new ArrayList<>();
list.add(new ValidType());
return list;
}
}
Я знаю, что во втором примере я мог бы просто сделать List и наследование классовэтот тип будет принят, это просто для того, чтобы попытаться понять, где я ошибаюсь с моим пониманием обобщения.
Все вышеперечисленное приводит к ошибке компиляции "add (T) в List не можетбыть примененным к (ValidType) ", например.
Где я неправильно понимаю использование обобщенных типов в качестве возвращаемых типов / параметров типа?