Итак, на Java я могу написать
List<?> list = new LinkedList<Double>();
но не
List<Container<?>> list = new LinkedList<Container<Double>>();
где Контейнер - это что-то вроде
public class Container<T> { ... }
Это произошло потому, что у меня есть метод, который принимает List<Container<?>>
, и я хотел бы использовать Arrays.asList для передачи ему аргументов:
process(Arrays.asList(new Container<Double>(), new Container<Double>()));
Но язык не позволяет этого, потому что он указывает тип Arrays.asList
на List<Container<Double>>
, и это не присваивается List<Container<?>>
.
Если я добавляю к вызову контейнер с параметрами String,
process(Arrays.asList(new Container<Double>(), new Container<String>()));
он по-прежнему не работает, поскольку он отображает тип List<Container<? extends Serializable & Comparable<?>>>
для Arrays.asList. Только если я передаю что-то, что не является ни сравнимым, ни Serializable, оно работает правильно.
Конечно, я могу добавить в литье и заставить компилятор заткнуться, но мне интересно, не делаю ли я здесь что-то не так.